如何在Pandas中按另一列将列值合并到单个单元格?
问题描述
我有如下DataFrame:
import pandas as pd import numpy as np df1 = pd.DataFrame({'vin':['aaa','aaa','aaa','bbb','ccc','ccc','ddd','eee','eee','fff'], 'module':['ABS','ABS','IPMA','BCCM','HPOC','ABS','ABS','HPOC','ABS','ABS']})
需要按vin列将对应的所有module列值拼接起来,预期输出如下:
df1 = pd.DataFrame({'vin':['aaa','aaa','aaa','bbb','ccc','ccc','ddd','eee','eee','fff'], 'module':['ABS','ABS','IPMA','BCCM','HPOC','ABS','ABS','HPOC','ABS','ABS'], 'New_module':['ABS-ABS-IPMA','ABS-ABS-IPMA','ABS-ABS-IPMA','BCCM','HPOC-ABS','HPOC-ABS','ABS','HPOC-ABS','HPOC-ABS','ABS']})
我曾尝试过一种需要复制DataFrame的方法:
df_merge = pd.merge(df2, df1.groupby(['vin'])['module'].apply(list), on ='vin', how ='left') df_merge['module'] = df_merge['module'].astype('str').str.replace("\[|\]|\'| ","") df_merge
请问有没有更简洁的代码可以实现预期效果?
简洁实现方法
可以用groupby结合transform方法,直接在原DataFrame上生成新列,无需额外合并操作,代码更简洁:
import pandas as pd import numpy as np df1 = pd.DataFrame({'vin':['aaa','aaa','aaa','bbb','ccc','ccc','ddd','eee','eee','fff'], 'module':['ABS','ABS','IPMA','BCCM','HPOC','ABS','ABS','HPOC','ABS','ABS']}) # 按vin分组拼接module,直接映射回原行生成新列 df1['New_module'] = df1.groupby('vin')['module'].transform(lambda x: '-'.join(x)) print(df1)
代码说明
groupby('vin')['module']:按vin字段分组,提取每组的module列数据transform(lambda x: '-'.join(x)):对每组执行字符串拼接操作,transform会自动将拼接结果按原DataFrame的行索引映射回去,保证同一vin的所有行都能拿到完整的拼接字符串- 全程无需创建中间DataFrame或执行合并操作,直接在原数据上新增目标列,代码更简洁高效
内容的提问来源于stack exchange,提问作者Jawed Sheikh
相关产品推荐
相关产品推荐

