遍历Pandas DataFrame行关联其他DataFrame取值的问题排查
问题解决:Pandas循环append后列值被覆盖的问题
问题原因
你当前代码的核心问题是:每次执行df_final['seq'] = df.loc[i, "seq"]时,会给整个df_final的seq列赋值,而非仅针对刚append的那部分行。最后一次循环处理的是seq='z',因此所有行的seq都被覆盖成了z。
修复方案一:修改循环逻辑,先给临时数据加seq再append
在append到df_final之前,先给当前要添加的子DataFrame加上对应的seq列,避免覆盖历史数据:
import pandas as pd df = pd.DataFrame(data={'table': ["a", "a", "b"], 'seq': ["xx", "xy", "z"]}) df_a = pd.DataFrame(data={'a_id': [1, 2, 3], 'col1': ["fg", "rt", "zh"]}) df_b = pd.DataFrame(data={'b_id': [4, 5, 6], 'col1': ["", "gh", "k"]}) df_final = pd.DataFrame() for i in range(len(df)): current_seq = df.loc[i, "seq"] if current_seq in ['xx', 'xy']: # 复制df_a的a_id列,添加当前seq后再合并 temp_df = df_a[['a_id']].copy() temp_df['seq'] = current_seq df_final = df_final.append(temp_df) elif current_seq == 'z': # 复制df_b的b_id列,添加当前seq后再合并 temp_df = df_b[['b_id']].copy() temp_df['seq'] = current_seq df_final = df_final.append(temp_df) # 可选:重置索引让序号连续 df_final = df_final.reset_index(drop=True) print(df_final)
执行后输出:
a_id seq b_id 0 1.0 xx NaN 1 2.0 xx NaN 2 3.0 xx NaN 3 1.0 xy NaN 4 2.0 xy NaN 5 3.0 xy NaN 6 NaN z 4.0 7 NaN z 5.0 8 NaN z 6.0
修复方案二:用Pandas向量化操作(更高效)
避免循环,利用concat和assign实现向量化处理,性能更优,尤其适合大数据集:
import pandas as pd df = pd.DataFrame(data={'table': ["a", "a", "b"], 'seq': ["xx", "xy", "z"]}) df_a = pd.DataFrame(data={'a_id': [1, 2, 3], 'col1': ["fg", "rt", "zh"]}) df_b = pd.DataFrame(data={'b_id': [4, 5, 6], 'col1': ["", "gh", "k"]}) # 处理xx、xy场景:重复df_a并绑定对应seq xx_xy_rows = pd.concat([df_a[['a_id']].assign(seq=val) for val in ['xx', 'xy']], ignore_index=True) # 处理z场景:绑定seq到df_b的b_id列 z_rows = df_b[['b_id']].assign(seq='z') # 合并所有结果 df_final = pd.concat([xx_xy_rows, z_rows], ignore_index=True) print(df_final)
输出与方案一完全一致,且更符合Pandas的最佳实践。
关键注意事项
- 不要直接对整个DataFrame的列赋值来修改新增行,应先给子数据集添加列再合并。
- 优先使用向量化操作替代循环逐行处理,提升代码效率和可读性。
内容的提问来源于stack exchange,提问作者Shanoo
相关产品推荐
相关产品推荐

