基于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
相关产品推荐
相关产品推荐

