2017-08-20 71 views
0

我的示例df有四列,其值爲NaN。目標是連接所有行,同時排除NaN值。在不包括NaN的大熊貓中組合多列

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'keywords_0':["a", np.nan, "c"], 
       'keywords_1':["d", "e", np.nan], 
       'keywords_2':[np.nan, np.nan, "b"], 
       'keywords_3':["f", np.nan, "g"]}) 

    keywords_0 keywords_1 keywords_2 keywords_3 
0   a   d  NaN   f 
1  NaN   e  NaN  NaN 
2   c  NaN   b   g 

要做到以下幾點:

keywords_0 keywords_1 keywords_2 keywords_3 keywords_all 
0   a   d  NaN   f  a,d,f 
1  NaN   e  NaN  NaN   e 
2   c  NaN   b   g  c,b,g 

僞代碼:

cols = [df.keywords_0, df.keywords_1, df.keywords_2, df.keywords_3] 

df["keywords_all"] = df["keywords_all"].apply(lambda cols: ",".join(cols), axis=1) 

我知道我可以使用",".join()得到確切的結果,但我不知道該如何打發列名進入函數。

回答

1

通過將axis=1傳遞給apply方法,可以在每行上應用",".join()。你首先需要放棄NaN。否則,你會得到一個TypeError。

df.apply(lambda x: ','.join(x.dropna()), axis=1) 
Out: 
0 a,d,f 
1  e 
2 c,b,g 
dtype: object 

您可以指定該回到原來的數據框與

df["keywords_all"] = df.apply(lambda x: ','.join(x.dropna()), axis=1) 

或者,如果你想爲你的問題沒有指定列:

cols = ['keywords_0', 'keywords_1', 'keywords_2', 'keywords_3'] 
df["keywords_all"] = df[cols].apply(lambda x: ','.join(x.dropna()), axis=1) 
+0

爲了你最後的命題分配回你的專欄keywords_all他需要轉換的cols爲'[ 'keywords_0', 'keywords_1', 'keywords_2' ,'keywords_3']'對嗎? –

+0

@RayhaneMama是的。我信任僞代碼,但我應該更清楚。謝謝。 – ayhan

+0

謝謝。這工作出色! – cptpython

0

只是提供另一種解決方案to_string

df1[df1.isnull()]='' 
df1.apply(lambda x : x.to_string(index =False,na_rep=False),axis=1).replace({"\n":','},regex=True) 

然後,只需通過使用

df['keywords_all']=df1.apply(lambda x : x.to_string(index =False,na_rep=False),axis=1).replace({"\n":','},regex=True) 

df.assign(keywords_all=df1.apply(lambda x : x.to_string(index =False,na_rep=False),axis=1).replace({"\n":','},regex=True) 
) 

Out[397]: 
    keywords_0 keywords_1 keywords_2 keywords_3 keywords_all 
0   a   d  NaN   f  a,d,f 
1  NaN   e  NaN  NaN   e 
2   c  NaN   b   g  b,c,g