Pandas列名不同的两DataFrame按ID匹配合并并拼接对应字段值
你原有代码无法得到预期结果的核心原因是groupby("jedi_number").sum()仅适用于数值类型累加,就算高版本pandas支持字符串sum拼接,也不会自动添加逗号分隔,同时你也没有将合并后的结果赋值给Looted Items列。
完整可运行解决方案
import pandas as pd # 你原有的数据构造代码 jedis = {'jedi_id': ["2", "4", "6", "1"], 'name':["Kylo", "Bastila", "Revan", "Steve from Minecraft"], 'Looted Items':[]} inventory = {'jedi_number': ["9", "4" , "6", "1", "1", "0", "2", "6", "1" , "55", "4", "4", "0", "9"], 'Loot':["Holocron", "Bantha Fodder", "Blaster", "Bantha Fodder", "Credits", "Bantha Fodder", "Blaster", "Bantha Fodder", "Holocron", "Blaster", "Holocron", "bread loaf", "Credits", "Holocron"]} jedis_df = pd.DataFrame(jedis) inventory_df = pd.DataFrame(inventory) # 1. 校验jedi_id是否存在于inventory的jedi_number中 jedis_df['id_exists'] = jedis_df['jedi_id'].isin(inventory_df['jedi_number']) # 2. 构造jedi_number到拼接后Loot的映射字典 loot_mapping = inventory_df.groupby('jedi_number')['Loot'].agg(','.join).to_dict() # 3. 给Looted Items列赋值,不存在匹配的ID填空字符串 jedis_df['Looted Items'] = jedis_df['jedi_id'].map(loot_mapping).fillna('')
运行后jedis_df的结果完全符合预期:
| jedi_id | name | id_exists | Looted Items |
|---|---|---|---|
| 2 | Kylo | True | Blaster |
| 4 | Bastila | True | Bantha Fodder,Holocron,bread loaf |
| 6 | Revan | True | Blaster,Bantha Fodder |
| 1 | Steve from Minecraft | True | Bantha Fodder,Credits,Holocron |
如果你更习惯用merge的写法,也可以用如下方式实现,效果完全一致:
# 先分组聚合得到每个jedi_number的拼接结果 inventory_agg = inventory_df.groupby('jedi_number', as_index=False)['Loot'].agg(','.join) # 左连接合并 jedis_df = jedis_df.merge(inventory_agg, left_on='jedi_id', right_on='jedi_number', how='left') # 赋值给Looted Items列后删除多余列 jedis_df['Looted Items'] = jedis_df['Loot'].fillna('') jedis_df = jedis_df.drop(columns=['jedi_number', 'Loot']) # 同样可以添加id是否存在的校验列 jedis_df['id_exists'] = jedis_df['jedi_id'].isin(inventory_df['jedi_number'])
内容的提问来源于stack exchange,提问作者darthhaider
相关产品推荐
相关产品推荐

