合并除NaN外的Pandas中的多列

cpt*_*hon 2 python concatenation pandas

我的样本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
Run Code Online (Sandbox Code Playgroud)

想要完成以下任务:

  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
Run Code Online (Sandbox Code Playgroud)

伪代码:

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)
Run Code Online (Sandbox Code Playgroud)

我知道我可以",".join()用来获取准确的结果,但是我不确定如何将列名传递给函数。

ayh*_*han 6

您可以",".join()通过传递axis=1apply方法来对每一行进行应用。您首先需要删除NaN。否则,您将收到TypeError。

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

您可以使用以下命令将其分配回原始DataFrame

df["keywords_all"] = df.apply(lambda x: ','.join(x.dropna()), axis=1)
Run Code Online (Sandbox Code Playgroud)

或者,如果您要像在问题中一样指定列:

cols = ['keywords_0', 'keywords_1', 'keywords_2', 'keywords_3']
df["keywords_all"] = df[cols].apply(lambda x: ','.join(x.dropna()), axis=1)
Run Code Online (Sandbox Code Playgroud)