2017-05-30 123 views
3

如何將列中的零值替換爲列的前一行值爲零的另一列的同一行中的值,即僅替換尚未遇到非零的位置的值? 例如:給定的列abc一個數據幀:熊貓:將零值替換爲另一列的值

+----+-----+-----+----+ 
| | a | b | c | 
|----+-----+-----|----| 
| 0 | 2 | 0 | 0 | 
| 1 | 5 | 0 | 0 | 
| 2 | 3 | 4 | 0 | 
| 3 | 2 | 0 | 3 | 
| 4 | 1 | 8 | 1 | 
+----+-----+-----+----+ 

b替換零個值和ca值,其中前一值是零

+----+-----+-----+----+ 
| | a | b | c | 
|----+-----+-----|----| 
| 0 | 2 | 2 | 2 | 
| 1 | 5 | 5 | 5 | 
| 2 | 3 | 4 | 3 | 
| 3 | 2 | 0 | 3 | <-- zero in this row is not replaced because of 
| 4 | 1 | 8 | 1 |  non-zero value (4) in row before it. 
+----+-----+-----+----+ 

回答

1
In [90]: (df[~df.apply(lambda c: c.eq(0) & c.shift().fillna(0).eq(0))] 
    ...: .fillna(pd.DataFrame(np.tile(df.a.values[:, None], df.shape[1]), 
    ...:       columns=df.columns, index=df.index)) 
    ...: .astype(int) 
    ...:) 
Out[90]: 
    a b c 
0 2 2 2 
1 5 5 5 
2 3 4 3 
3 2 0 3 
4 1 8 1 

說明:

In [91]: df[~df.apply(lambda c: c.eq(0) & c.shift().fillna(0).eq(0))] 
Out[91]: 
    a b c 
0 2 NaN NaN 
1 5 NaN NaN 
2 3 4.0 NaN 
3 2 0.0 3.0 
4 1 8.0 1.0 

現在我們可以填寫NaN的從下方與DF的相應值(這是建立在3級聯a列):

In [92]: pd.DataFrame(np.tile(df.a.values[:, None], df.shape[1]), columns=df.columns, index=df.index) 
Out[92]: 
    a b c 
0 2 2 2 
1 5 5 5 
2 3 3 3 
3 2 2 2 
4 1 1 1 
+0

真的很好的解釋。謝謝。這裏唯一的問題是,如果'b'沒有0,它將使用它來填充'c',而不是使用'a'中的值。不是嗎? – DougKruger

+0

@DougKruger,我想你在說我以前的答案,它使用'.ffill(axis = 1)'。我已經更新了它 - 請在解釋中檢查 – MaxU

+0

,b和c中的所有值已被c完全覆蓋。 – DougKruger