You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_idnameid_existsLooted Items
2KyloTrueBlaster
4BastilaTrueBantha Fodder,Holocron,bread loaf
6RevanTrueBlaster,Bantha Fodder
1Steve from MinecraftTrueBantha 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:06:00