Pandas如何基于多条件匹配不同DataFrame生成目标新列
Pandas按多规则匹配生成新列实现方案
实现思路
- 先将两个映射表去重后转为字典结构,避免重复值导致匹配异常,同时提升匹配效率
- 采用向量化条件判断实现多分支匹配,按优先级执行规则:
- Value1为空(含空字符串、NaN)时新列直接赋值为
- - Value1为
Tactical时,用Value2匹配df3的映射关系 - 其余场景默认用Value1匹配df2的映射关系
- Value1为空(含空字符串、NaN)时新列直接赋值为
完整代码
1. 导入依赖&构建测试数据
import pandas as pd import numpy as np # 构建主表Sample_df Sample_df = pd.DataFrame({ 'No.': [1,2,3,4,5], 'Value1': ['AS', 'AS', 'Product', '', 'Tactical'], 'Value2': ['DS', 'BS', '-', 'AS', 'VS'] }) # 构建映射表df2 df2 = pd.DataFrame({ 'Value1': ['AS', 'AS', 'Product'], 'Num': ['Des', 'Des', 'P'] }) # 构建映射表df3 df3 = pd.DataFrame({ 'Value2': ['DS', 'AS', 'BS', 'VS'], 'Num': ['Des', 'Bed', 'Ged', 'Vis'] })
2. 生成映射字典&计算新列
# 生成去重后的映射字典 map_v1 = df2.drop_duplicates('Value1').set_index('Value1')['Num'].to_dict() map_v2 = df3.drop_duplicates('Value2').set_index('Value2')['Num'].to_dict() # 按规则生成新列 Sample_df['NewCol'] = np.where( Sample_df['Value1'].fillna('') == '', '-', np.where( Sample_df['Value1'] == 'Tactical', Sample_df['Value2'].map(map_v2), Sample_df['Value1'].map(map_v1) ) )
输出结果验证
执行后打印Sample_df即可得到预期结果:
No. Value1 Value2 NewCol 0 1 AS DS Des 1 2 AS BS Des 2 3 Product - P 3 4 AS - 4 5 Tactical VS Vis
补充说明
如果后续规则更复杂,也可以用自定义函数+apply实现,但大数据量场景下优先使用上述向量化方案,性能远高于行遍历的apply方式。
内容的提问来源于stack exchange,提问作者s_khan92
相关产品推荐
相关产品推荐

