如何在熊猫数据框中创建逗号分隔列表作为新列

时间:2020-06-23 15:05:31

标签: python pandas dataframe

我有如下数据框(df)。

我也想跳过空值(如果有)。

输入

 A            B              C   
a@gmail.com   y@yahoo.com    g@mail.com
b@gmail.com
c@gmail.com   g@gmail.com    d@gmail.com
d@gmail.com                  t@gmail.com
               r@gmail.com   y@gmail.com

输出

 A            B              C             Merged
a@gmail.com   y@yahoo.com    g@mail.com    a@gmail.com,y@yahoo.com,g@mail.com
b@gmail.com                                b@gmail.com
c@gmail.com   g@gmail.com    d@gmail.com   c@gmail.com,g@gmail.com,d@gmail.com
d@gmail.com                  t@gmail.com   d@gmail.com,t@gmail.com
               r@gmail.com   y@gmail.com   r@gmail.com,y@gmail.com

如何使用熊猫来做到这一点?

5 个答案:

答案 0 :(得分:3)

编辑:正如Scott Boston所指出的,在第四行的情况下,该解决方案在合并列中留下了两个逗号。

您可以尝试:

df['merged'] = df.A.str.cat([df.B, df.C], sep=',', na_rep='').str.strip(',')

这是通过串联列然后在空值的情况下除去开头和结尾的逗号来实现的。

答案 1 :(得分:3)

使用(已更新,可处理''vs NaN):

df.replace('', np.nan).apply(lambda x: x.str.cat(sep=', '), axis=1)

输出:

0     a@gmail.com, y@yahoo.com, g@mail.com
1                              b@gmail.com
2    c@gmail.com, g@gmail.com, d@gmail.com
3                 d@gmail.com, t@gmail.com
4                 r@gmail.com, y@gmail.com
dtype: object

就像

df['merged'] = df.replace('', np.nan).apply(lambda x: x.str.cat(sep=', '), axis=1)

输出:

             A            B            C                                 merged
0  a@gmail.com  y@yahoo.com   g@mail.com   a@gmail.com, y@yahoo.com, g@mail.com
1  b@gmail.com          NaN          NaN                            b@gmail.com
2  c@gmail.com  g@gmail.com  d@gmail.com  c@gmail.com, g@gmail.com, d@gmail.com
3  d@gmail.com          NaN  t@gmail.com               d@gmail.com, t@gmail.com
4          NaN  r@gmail.com  y@gmail.com               r@gmail.com, y@gmail.com

答案 2 :(得分:2)

另一种方法是stack,然后在级别= 0(行)上加入分组:

df.assign(Merged=df.stack().groupby(level=0).agg(','.join))

或者:

df.assign(Merged = df.replace('',np.nan).stack().groupby(level=0).agg(','.join))

             A            B            C                               Merged
0  a@gmail.com  y@yahoo.com   g@mail.com   a@gmail.com,y@yahoo.com,g@mail.com
1  b@gmail.com          NaN          NaN                          b@gmail.com
2  c@gmail.com  g@gmail.com  d@gmail.com  c@gmail.com,g@gmail.com,d@gmail.com
3  d@gmail.com          NaN  t@gmail.com              d@gmail.com,t@gmail.com
4          NaN  r@gmail.com  y@gmail.com              r@gmail.com,y@gmail.com

答案 3 :(得分:1)

df['Merged'] = df['A B C'.split()].apply(lambda x: ','.join(x.dropna()), axis=1)

结果:

             A            B            C                               Merged
0  a@gmail.com  y@yahoo.com   g@mail.com   a@gmail.com,y@yahoo.com,g@mail.com
1  b@gmail.com         None         None                          b@gmail.com
2  c@gmail.com  g@gmail.com  d@gmail.com  c@gmail.com,g@gmail.com,d@gmail.com
3  d@gmail.com  t@gmail.com         None              d@gmail.com,t@gmail.com
4  r@gmail.com  y@gmail.com         None              r@gmail.com,y@gmail.com

答案 4 :(得分:0)

您可以按照以下说明进行操作

import pandas as pd

data = {'d1': ['abc@gmail.com','abc@gmail.cm','abc@gil.com','ab32c@gmail.com'],
        'd2': ['ab3c@g3mail.com','ab32c@gmail.com','ab234c@gma234il.com','abc@htil.com']
        }

df = pd.DataFrame(cars, columns = ['d1', 'd2'])


x = df.to_string(header=False,index=False,index_names=False).split('\n')


df['merged'] = [','.join(ele.split()) for ele in x]

输出:

enter image description here