两个DataFrame间多索引匹配优化:替代嵌套for循环的高效方案
高效实现多列匹配填充DataFrame的方法
核心思路
用pandas内置的透视表+合并操作替代嵌套循环,这两个操作都是底层优化的矢量化运算,处理百万级数据的效率远高于Python层面的循环逻辑。
具体步骤
1. 将查找表转换为宽格式
先把df_1从长格式(单条记录对应一个step的work_time)转成宽格式(每个匹配组合对应A、B、C三列的工时):
# 透视df_1,将step转为列名,work_time作为对应列的值 pivoted_df1 = df_1.pivot_table( index=['store', 'department', 'task', 'employee', 'month_year_date'], columns='step', values='work_time', aggfunc='first' # 若同一匹配组合+step有重复值,可按需替换聚合函数,比如'sum'/'mean' ).reset_index() # 确保列名与df_2的A、B、C完全对应(若df_1的step值本身就是'A'/'B'/'C',此步可省略) pivoted_df1.columns = ['store', 'department', 'task', 'employee', 'month_year_date', 'A', 'B', 'C']
2. 匹配填充目标表
将转换后的宽表与df_2通过指定列合并,自动完成A、B、C列的填充:
# 左合并保留df_2的所有行,匹配不到的记录会填充NaN df_2 = df_2.merge( pivoted_df1, on=['store', 'department', 'task', 'employee', 'month_year_date'], how='left' )
额外优化建议
- 确保匹配列(store、department等)在df_1和df_2中的数据类型完全一致(比如都是字符串或整数),避免类型不匹配导致的合并效率低下或错误。
- 如果df_1存在大量重复的匹配组合+step记录,先去重再透视能进一步提升效率:
df_1_clean = df_1.drop_duplicates(subset=['store', 'department', 'task', 'employee', 'month_year_date', 'step'])
内容的提问来源于stack exchange,提问作者Luxo_Jr
相关产品推荐
相关产品推荐

