我的示例df有四列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()
来获得确切的结果,但我不确定如何将列名传递给函数。
答案 0 :(得分:3)
您可以通过将",".join()
传递给apply方法,在每一行上应用axis=1
。你首先需要放弃NaNs。否则你会得到一个TypeError。
df.apply(lambda x: ','.join(x.dropna()), axis=1)
Out:
0 a,d,f
1 e
2 c,b,g
dtype: object
您可以使用
将其分配回原始DataFramedf["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)
答案 1 :(得分:0)
使用to_string
提供另一种解决方案:
df1[df1.isnull()]=''
df1.apply(lambda x : x.to_string(index =False,na_rep=False),axis=1).replace({"\n":','},regex=True)
然后使用
将其分配回专栏keywords_all
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