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
相关产品推荐
相关产品推荐

