2016-11-05 58 views
1

我想應用一個像fillna()那樣行爲但功能與nan不同的函數。不幸的是DataFrame.replace()不適用於我的情況。這裏有一個例子:給定一個數據幀:尋找一個類似於DataFrame.nafill()的熊貓函數

df = pd.DataFrame([[1,2,3],[4,-1,-1],[5,6,-1]]) 

     0 1 2 
    0 1 2.0 3.0 
    1 4 -1.0 -1.0 
    2 5 6.0 -1.0 
    3 7 8.0 NaN 

我找這將輸出功能:

 0 1 2 
    0 1 2.0 3.0 
    1 4 2.0 3.0 
    2 5 6.0 3.0 
    3 7 8.0 NaN 

所以df.replace()to_replace=-1'method='ffill'不會起作用,因爲它需要一個列獨立value這將取代-1條目。在我的例子中,它是依賴於列的。我知道我可以用循環對其進行編碼,但是我正在尋找一個高效的代碼,因爲它將應用於大型數據框。有什麼建議麼?謝謝。

+0

你舉的例子好像如果你通過楠取代-1它會工作然後填寫。你能舉一個例子嗎? – DSM

+0

是的,萬一在DataFrame中有-1和nan的混合。我將爲這種情況添加一個編輯 – splinter

+0

新增了@DSM,請參閱已編輯的問題。 – splinter

回答

3

你可以只是NaN替換值,然後調用ffill

In [3]: 

df.replace(-1, np.NaN).ffill() 
Out[3]: 
    0 1 2 
0 1 2 3 
1 4 2 3 
2 5 6 3 

我認爲你是在想這

編輯

如果你已經有NaN值,那麼創建一個布爾型掩碼並在掩碼的反向上再次更新這些元素ffill

In [15]:  
df[df == -1] = df[df != -1].ffill() 
df 

Out[15]: 
    0 1 2 
0 1 2 3 
1 4 2 3 
2 5 6 3 
3 7 8 NaN 

另一種方法(感謝在評論@DSM)是使用where基本上做上述同樣的事情:

In [17]: 
df.where(df != -1, df.replace(-1, np.nan).ffill()) 

Out[17]: 
    0 1 2 
0 1 2 3 
1 4 2 3 
2 5 6 3 
3 7 8 NaN 
+0

謝謝。不幸的是,如果除了原始Dataeframe中的-1項之外還有nans,則不起作用。我將編輯以顯示一個示例。 – splinter

+0

查看適用於您的修改示例的更新答案 – EdChum

+0

謝謝@EdChum,請參閱編輯問題中的示例。我相信你編輯的解決方案不適合我的想法。我不需要「跳過」nans。我對南斯之後發生的一切毫無興趣。 – splinter