基于pandas累积列实现数据匹配补全车辆字段的方法咨询
Pandas 实现方案
不需要手动遍历表数据,用pandas自带的分组聚合、合并操作即可完成需求,完整可运行代码如下:
import pandas as pd # 1. 定义车辆类型到缩写的映射规则 vehicle_mapping = { 'car': 'C', 'motorcycle': 'M', 'boat': 'B' } # ---------------------- # 样例数据构造(实际使用时替换为你自己读取的df1、df2即可,比如用pd.read_csv读入本地文件) # 第一张表 df1 = pd.DataFrame([ ['jeff', 20, 100, 'missing'], ['shinji', 24, 120, 'missing'], ['rodger', 18, 150, 'missing'], ['eric', 25, 160, 'missing'], ['romeo', 30, 170, 'missing'] ], columns=['names', 'age', 'salary', 'vehicle']) # 第二张表 df2 = pd.DataFrame([ ['jeff', 20, 100, 'car', 'video games'], ['jeff', 20, 100, 'car', 'cell phone'], ['jeff', 20, 100, 'motorcycle', 'soft drink'], ['jeff', 20, 100, 'boat', 'pharmaceuticals'], ['shinji', 24, 120, 'car', 'robots'], ['shinji', 24, 120, 'car', 'animation'], ['rodger', 18, 150, 'car', 'cars'], ['rodger', 18, 150, 'motorcycle', 'glasses'], ['eric', 25, 160, 'boat', 'video games'], ['eric', 25, 160, 'car', 'arms'], ['romeo', 30, 70, 'boat', 'vaccines'] ], columns=['names', 'age', 'salary', 'vehicle', 'industry']) # ---------------------- # 2. 处理第二张表,按匹配键分组聚合得到车辆缩写拼接结果 df2_agg = df2.groupby(['names', 'age', 'salary'], as_index=False)['vehicle'].agg( # 先去重避免重复计算相同车辆、映射为缩写后按C→M→B的固定顺序排序再拼接 lambda x: ''.join(sorted([vehicle_mapping[v] for v in x.unique()], key=lambda i: ['C','M','B'].index(i))) ).rename(columns={'vehicle': 'vehicle_result'}) # 3. 合并结果到第一张表,替换原有missing值 df1 = df1.merge(df2_agg, on=['names', 'age', 'salary'], how='left') # 匹配不到的条目保留原有值 df1['vehicle'] = df1['vehicle_result'].fillna(df1['vehicle']) df1 = df1.drop(columns=['vehicle_result']) # 输出最终结果 print(df1)
结果说明
运行代码后得到的df1和你要求的效果完全一致,样例中romeo因为两张表的salary数值不一致匹配不上,所以保留missing值,修正数值后即可得到B的结果。
- 聚合时调用
unique()避免同一个用户重复的车辆类型生成重复缩写 - 固定排序规则保证拼接结果总是按C(car)→M(motorcycle)→B(boat)的顺序排列,不会因为第二张表的条目顺序变化导致结果混乱
- 左连接逻辑保留第一张表的所有条目,匹配失败不会丢失原有数据
内容的提问来源于stack exchange,提问作者Muscular_Neanderthal
相关产品推荐
相关产品推荐

