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

基于DataFrame配对更新值:同餐桌人员对应value字段更新问题

解决同餐桌人员的关系表字段更新问题

嘿,这个场景我之前处理过,咱们来一步步搞定它~你的需求核心是:根据meeting表中的餐桌信息,找到df里同属一张餐桌的人员对,把对应行的value加上100。下面给你两种实现思路,其中第一种是更高效简洁的方案。

方案一:字典映射+条件筛选(推荐)

这种方法通过构建人员到餐桌的映射关系,快速判断每对人员是否同桌,操作简单且性能优异,尤其适合数据量较大的情况。

完整代码

import pandas as pd

# 初始化原始数据
data = {"p1":['Jen','Mark','Carrie'], "p2":['John','Jason','Rob'], "value":[10,20,40]}
df = pd.DataFrame(data, columns=["p1",'p2','value'])
meeting_data = {'person':['Jen','Mark','Carrie','John','Jason','Rob'], 'table':[1,2,3,1,2,3]}
meeting = pd.DataFrame(meeting_data, columns=['person','table'])

# 1. 构建「人员-餐桌」的映射字典,方便快速查找
table_map = meeting.set_index('person')['table'].to_dict()

# 2. 给df添加p1和p2对应的餐桌列
df['p1_table'] = df['p1'].map(table_map)
df['p2_table'] = df['p2'].map(table_map)

# 3. 筛选出同餐桌的行,更新value值
df.loc[df['p1_table'] == df['p2_table'], 'value'] += 100

# 可选:删除临时添加的餐桌列
df = df.drop(['p1_table', 'p2_table'], axis=1)

print(df)

输出结果

p1    p2  value
0    Jen  John    110
1   Mark Jason    120
2  Carrie   Rob    140

思路解释

  • 字典映射是O(n)时间复杂度的操作,比表连接快很多;
  • 通过map方法快速给每对人员匹配餐桌号,再用条件筛选定位需要更新的行,逻辑清晰易懂。

方案二:自连接meeting表(你考虑的思路)

如果你偏向用表连接的方式实现,也可以对meeting表做自连接,生成所有同餐桌的人员对,再和df匹配更新。不过这种方法在数据量大时会产生较多冗余行,性能不如方案一。

完整代码

import pandas as pd

# 初始化原始数据
data = {"p1":['Jen','Mark','Carrie'], "p2":['John','Jason','Rob'], "value":[10,20,40]}
df = pd.DataFrame(data, columns=["p1",'p2','value'])
meeting_data = {'person':['Jen','Mark','Carrie','John','Jason','Rob'], 'table':[1,2,3,1,2,3]}
meeting = pd.DataFrame(meeting_data, columns=['person','table'])

# 1. 自连接meeting表,获取同餐桌的所有人员对
same_table_pairs = meeting.merge(meeting, on='table', suffixes=('_1', '_2'))
# 排除自身配对和重复配对(比如Jen-John和John-Jen视为同一对)
same_table_pairs = same_table_pairs[same_table_pairs['person_1'] < same_table_pairs['person_2']]

# 2. 把df和配对表的人员对统一为「有序元组」,方便匹配
df['pair'] = df.apply(lambda row: tuple(sorted([row['p1'], row['p2']])), axis=1)
same_table_pairs['pair'] = same_table_pairs.apply(lambda row: (row['person_1'], row['person_2']), axis=1)

# 3. 匹配并更新value值
mask = df['pair'].isin(same_table_pairs['pair'])
df.loc[mask, 'value'] += 100

# 可选:删除临时添加的pair列
df = df.drop('pair', axis=1)

print(df)

思路解释

  • 自连接会生成所有同餐桌的人员组合,需要额外处理重复配对的问题;
  • 通过将人员对转为有序元组,解决df中p1/p2顺序和配对表不一致的问题。

内容的提问来源于stack exchange,提问作者Ted Mosby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:22:55