在 Pandas 中合并多个列,排除 NaN 值

14

我的示例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()来获得精确的结果,但我不确定如何将列名传递到函数中。

3个回答

21

您可以通过将axis=1传递给应用程序方法,在每一行上应用",".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

你可以使用以下代码将其分配回原始DataFrame:

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)

你的最后一个建议是他需要将cols转换为['keywords_0', 'keywords_1', 'keywords_2', 'keywords_3'],对吗? - Rayhane Mama
@RayhaneMama 是的,没错。我相信了伪代码,但我应该更清楚明白。谢谢。 - ayhan

1
只需提供另一种使用 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)

or

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

0

您可以先填充名称,例如使用空字符串: 类似这样的代码 df["keywords_all"] = df['keywords_0'].fillna('') +


除此之外,这将产生空单元格,用连续的逗号表示,而不是他预期的输出格式。例如,第一行将是“a,d,,f”,而不是“a,d,f”。 - Steve Estes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接