我有如下数据框(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
如何使用熊猫来做到这一点?
答案 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]
输出: