2016-05-31 90 views
0

我最近開始與熊貓一起工作,並且試圖對數據進行一些簡單的清理。到目前爲止,我已經瞭解到使用熊貓時有很多單線程。所以我正在尋找一個在我的情況。我有DataFrame這樣的:熊貓 - 使用其他列的值替換NaN值

C0   C1 C2   C3  C4 
    3789507  2010 NaN  NaN  NaN 
    3789508  NaN NaN  2010  NaN 
    3789509  NaN NaN  2016  NaN 
    3789510  NaN 2014  NaN  NaN 
    3789511  NaN NaN  NaN  2014 

我想這樣的事情結束了:

C0   C1 
3789507  2010 
3789508  2010 
3789509  2016 
3789510  2014 
3789511  2014 

我現在這樣簡單地說就是:

k = df.C1.isnull() 
df.C1[k] = df.C2[k] 
k = df.C1.isnull() 
df.C1[k] = df.C3[k] 
k = df.C1.isnull() 
df.C1[k] = df.C4[k] 

這是工作,但並不是最好的解決方案。如果我將列100列?循環這裏唯一的解決方案?

萬一我的for循環看起來像這樣:

for i in range(2,len(df.columns)): 
    k = df.C1.isnull() 
    df.C1[k] = df.ix[:,i] 

回答

1

大熊貓有一些方法來回填和forwardfill缺失值,所以你可以做:

df['C1'] = df.bfill(axis='columns')['C1'] 

df 
Out[10]: 
     C0  C1  C2  C3  C4 
0 3789507 2010.0  NaN  NaN  NaN 
1 3789508 2010.0  NaN 2010.0  NaN 
2 3789509 2016.0  NaN 2016.0  NaN 
3 3789510 2014.0 2014.0  NaN  NaN 
4 3789511 2014.0  NaN  NaN 2014.0 

本工程爲您簡單的例子數據但在真實數據集中,您可能不得不限制正在回填的列,如:

fill_cols = ['C1', 'C2', 'C3', 'C4'] 
df['C1'] = df[fill_cols].bfill(axis='columns')['C1'] 
+0

只有一個問題 - 如果它不是一個大麻煩,你能解釋它是如何工作的嗎?我應該從後面讀嗎?我的意思是這個真實的案例與選定的列。 – sebap123

+1

好的,看看'C4'有一個值的行,但其他列都丟失了。 'df.bfill(axis ='columns')'創建一個新的數據幀,該行中'C4'左邊的每個缺失值從'C4'得到值。 「C4」中的有效值被「回填」到所有缺失的列中。然後,我們只需將回填的C1列複製到原始數據框中即可。 – Marius

+0

非常感謝 - 現在我明白了。 – sebap123