2013-06-20 143 views
4

我試圖連接幾個列其中大多包含NaN的一個,但這裏是只有2個例子:串聯列熊貓

2013-06-18 21:46:33.422096-05:00 A NaN 
2013-06-18 21:46:35.715770-05:00 A NaN 
2013-06-18 21:46:42.669825-05:00 NaN B 
2013-06-18 21:46:45.409733-05:00 A NaN 
2013-06-18 21:46:47.130747-05:00 NaN B 
2013-06-18 21:46:47.131314-05:00 NaN B 

這可能會持續3或4或10列,總1爲pd.notnull(),其餘爲NaN。

我想將它們連接成1列,儘可能最快的方式。我怎樣才能做到這一點?

回答

5

你得到每行一個字符串和其他細胞NaN,然後運用數學是要求爲max值:

df.max(axis=1) 

按照評論,如果它沒有在Python 3工作,請將您的NaN投射到以前的字符串中:

df.fillna('').max(axis=1) 
+0

僅供參考,這將無法在python 3中工作。我不記得細節,但我改變了字符串和數字的比較。在python 3中,它返回所有的nans。 – TomAugspurger

+0

@TomAugspurger謝謝你的評論,我相應修改了答案 – Boud

0

你可以做

In [278]: df = pd.DataFrame([[1, np.nan], [2, np.nan], [np.nan, 3]]) 

In [279]: df 
Out[279]: 
    0 1 
0 1 NaN 
1 2 NaN 
2 NaN 3 

In [280]: df.sum(1) 
Out[280]: 
0 1 
1 2 
2 3 
dtype: float64 

由於NaN s的0相加的時候,他們不露面處理。

一些注意事項:您需要確保只有其中一列有一個非楠爲此工作。它也只適用於數字數據。

您還可以使用

df.fillna(method='ffill', axis=1).iloc[:, -1] 

最後一列現在將包含所有有效的意見,因爲有效問卷已經充滿進取。請參閱文檔here。第二種方式應該更靈活,但速度更慢。我用iloc[:, -1]切掉每一行和最後一列。

+0

我的不好,這絕對是字符串。將編輯 – user1610719

+0

所以我會嘗試第二個選項,但我很驚訝沒有一個更簡單的選項。這實際上只是再次進行concatting,但只是使用列而不是數據框。 – user1610719