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

Pandas如何基于二进制0/1 DataFrame对df1条件赋值生成新DataFrame

实现方法

最优解法(向量化运算,无需循环)

直接用pandas内置的where方法即可实现需求,逻辑和你描述的规则完全匹配:当df2对应位置为1时保留df1的值,否则替换为0,同时自动跳过日期列不做修改,性能远高于手动循环遍历。

import pandas as pd

# 你的示例数据
df1 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[1.2, 2.3, 0.3, 0.5], 
    '02K W':[3.5, 0.1, 'nan', 'nan'], 
    '03K W':[4.2, 5.2, 2.5, 3.0], 
    '04K W':[1.5, 2.6, 8.2, 4.2]})

df2 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[1, 1, 1, 1], 
    '02K W':[1, 0, 0, 0], 
    '03K W':[0, 0, 0, 1], 
    '04K W':[0, 1, 1, 0]}) 

# 核心实现代码
df3 = df1.copy()
# 排除日期列,只处理数值列
num_cols = df1.columns.drop('Date')
# 按条件替换:df2对应位置为1保留df1值,否则设为0
df3[num_cols] = df1[num_cols].where(df2[num_cols] == 1, 0)

运行后输出的df3和你期望的结果完全一致。

另一种更简洁的写法(适合确认所有数值列无异常的场景)

因为df2是0/1格式,直接对应位置相乘也可以得到结果,需要注意对日期列单独处理:

df3 = df1.set_index('Date') * df2.set_index('Date')
df3 = df3.reset_index()

原代码错误说明

你之前的写法主要存在3个问题:

  • 不能直接将for循环赋值给df3变量
  • pandas的Series没有value属性,你想取列值的写法是错误的
  • 逐列遍历的方式效率很低,pandas的向量化运算可以直接处理整个表格的对应位置计算,不需要手动写循环

内容的提问来源于stack exchange,提问作者fjurt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:05