pandas DataFrame基于其他列值将NaN替换为0的高效实现方法
高效实现Pandas DataFrame条件空值替换
你写的逐行循环效率极低,本质是放弃了Pandas底层的向量化运算优化,所有逻辑都在Python层执行,处理千万级数据自然性能极差。
最优向量化实现方案
仅需一行代码即可完成需求,底层为C实现的批量运算,2000万行数据通常数秒就能处理完成:
# 同时满足两个条件时替换B列值:A列等于0,B列为空值 df.loc[(df['A'] == 0) & df['B'].isna(), 'B'] = 0
逻辑说明:
(df['A'] == 0)筛选出A列取值为0的所有行df['B'].isna()筛选出B列为空值的所有行- 两个条件用
&(与逻辑)拼接,同时满足的行才会触发B列赋值为0的操作,其余行完全保留原值,和你需要的效果完全一致
补充说明
你原来的循环代码还存在两个问题:
- 语法错误:
math.isnan(df.loc[i,'B']) = True应为双等号== - 兼容性问题:
math.isnan无法处理非数值类型的空值,用Pandas自带的isna()方法适配性更好
可选替代方案
用mask方法也可以实现相同效果,两种方案性能无明显差异:
df['B'] = df['B'].mask((df['A'] == 0) & df['B'].isna(), 0)
内容的提问来源于stack exchange,提问作者el-cheapo
相关产品推荐
相关产品推荐

