Pandas比对两个DataFrame将df1为0的对应位置在df2置0的实现方法
Pandas 同结构DataFrame指定位置替换实现方案
核心逻辑
仅替换df1中值为0的对应df2位置为0,其余数据保留df2原值,包括df2原有NaN值也不受影响。
可选实现方案
方案1:mask方法(最简洁)
# 筛选数值列,排除name等非比对用的标识列 num_cols = df1.select_dtypes(include='number').columns # df1对应位置为0时,df2对应位置赋值为0 df2[num_cols] = df2[num_cols].mask(df1[num_cols] == 0, 0)
方案2:布尔索引直接赋值
num_cols = df1.columns[df1.columns != 'name'] df2.loc[df1[num_cols] == 0, num_cols] = 0
方案3:where方法
num_cols = df1.select_dtypes(include='number').columns df2[num_cols] = df2[num_cols].where(df1[num_cols] != 0, 0)
完整可运行测试代码
import pandas as pd import numpy as np # 构造示例df1 df1 = pd.DataFrame({ 'name': ['cm1', 'cm2', 'cm3'], 'data1': [10, 0, 1], 'data2': [0, 20, 0], 'data3': [30, 0, 20], 'data4': [0, 20, np.nan] }) # 构造示例df2 df2 = pd.DataFrame({ 'name': ['cm1', 'cm2', 'cm3'], 'data1': [6, 9, 1], 'data2': [10, np.nan, np.nan], 'data3': [15, 20, 20], 'data4': [20, 3, 30] }) # 执行替换逻辑 num_cols = df1.select_dtypes(include='number').columns df2[num_cols] = df2[num_cols].mask(df1[num_cols] == 0, 0) # 输出结果 print(df2)
注意事项
- 操作前需保证两个DataFrame的索引、列名、行列顺序完全一致,避免出现错位替换
- 如果需要将非数值列也纳入比对规则,直接删除
select_dtypes筛选逻辑,对全表执行操作即可
内容的提问来源于stack exchange,提问作者Lucky sardar
相关产品推荐
相关产品推荐

