Pandas合并DF时如何按vin匹配将module值逗号拼接存同一单元格
Python pandas按列匹配合并同组值到单元格实现
现有数据
import pandas as pd 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'] }) df2 = pd.DataFrame({'vin':['aaa','bbb','ccc','ddd','eee','fff']})
需求说明
按vin列做匹配,从df1中提取对应module列的取值写入df2,同一个vin对应的所有module值以逗号分隔,存入同一个单元格。
直接使用普通左连接写法的问题:
# 该写法会生成多行重复数据,不符合要求 df_merge = pd.merge(df2, df1[['module','vin']], on ='vin', how ='left')
期望输出效果:
| vin | module |
|---|---|
| aaa | ABS,ABS,IPMA |
| bbb | BCCM |
| ccc | HPOC,ABS |
| ddd | ABS |
| eee | HPOC,ABS |
| fff | ABS |
实现方法
- 方法1:先分组聚合再合并
先对df1按vin分组,将同组的module值拼接为单个字符串,再和df2做左连接,不会产生重复行:# 分组聚合拼接同组module值 df1_agg = df1.groupby('vin', as_index=False)['module'].apply(','.join) # 左连接匹配 df_result = pd.merge(df2, df1_agg, on='vin', how='left') - 方法2:映射赋值(写法更简洁)
先生成vin到拼接后module值的映射字典,直接通过map方法给df2新增列:module_map = df1.groupby('vin')['module'].apply(','.join).to_dict() df2['module'] = df2['vin'].map(module_map)
补充:如果需要对同组module值去重后再拼接,可以在拼接前去重,例如保留原有顺序去重的写法为lambda x: ','.join(dict.fromkeys(x)),不需要保留顺序可以直接用lambda x: ','.join(set(x))。
内容的提问来源于stack exchange,提问作者jawed
相关产品推荐
相关产品推荐

