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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:45:01