2017-08-20 52 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