You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)

逻辑说明

  1. 优先级映射生成:combine_first方法完美契合你的需求——当Marks1不为空时保留其值,为空则用Marks2的值填充,两者都为空时结果为NaN(对应你要求的“设为空”)。将No设为索引后,后续匹配的查找效率会大幅提升。
  2. 高效更新列:map方法基于索引进行批量匹配,时间复杂度为O(n),比apply、循环遍历等方法快得多,完全适配数十万条数据的处理场景。

示例验证

用你给出的测试数据代入:

  • 处理后priority_mapping的结果为:
    1234    99
    2515    98
    3412    20
    4854    98
    7732    NaN
    
  • 更新后的df1完全符合预期结果:
    NoTotal
    123499
    251598
    341220
    485498
    7732NaN

额外注意事项

  • 如果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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:22:50