基于Pandas DataFrame按No匹配替换Total列值的技术问询
基于Pandas高效实现DataFrame列的条件匹配替换
针对你这个数十万条数据量级的匹配替换需求,我推荐用以下高效的方式实现,既满足逻辑要求又能保证性能:
import pandas as pd # 假设你的两个DataFrame已经加载为df1和df2 # 第一步:生成优先级映射Series,优先取Marks1,空值用Marks2填充 priority_mapping = df2.set_index('No')['Marks1'].combine_first(df2.set_index('No')['Marks2']) # 第二步:更新df1的Total列 df1['Total'] = df1['No'].map(priority_mapping)
逻辑说明
- 优先级映射生成:
combine_first方法完美契合你的需求——当Marks1不为空时保留其值,为空则用Marks2的值填充,两者都为空时结果为NaN(对应你要求的“设为空”)。将No设为索引后,后续匹配的查找效率会大幅提升。 - 高效更新列:
map方法基于索引进行批量匹配,时间复杂度为O(n),比apply、循环遍历等方法快得多,完全适配数十万条数据的处理场景。
示例验证
用你给出的测试数据代入:
- 处理后
priority_mapping的结果为:1234 99 2515 98 3412 20 4854 98 7732 NaN - 更新后的
df1完全符合预期结果:No Total 1234 99 2515 98 3412 20 4854 98 7732 NaN
额外注意事项
- 如果
df1中存在df2没有的No值,默认会将对应Total设为NaN。如果需要保留原Total值,可以修改为:df1['Total'] = df1['No'].map(priority_mapping).fillna(df1['Total']) - 若需要统一
Total列的数据类型(比如确保为整数),可以添加类型转换:df1['Total'] = df1['Total'].astype(pd.Int64Dtype()) # 支持空值的整数类型
内容的提问来源于stack exchange,提问作者RK.
相关产品推荐
相关产品推荐

