Pandas如何基于其他DataFrame的列值新建条件计算列
问题说明
现有2个DataFrame:
- df1:存储不同时间点各类水果的数量
Time Apples Pears Grapes Peachs 10:00 3 5 5 2 11:00 1 0 2 9 12:00 20 2 7 3
- df2:存储分类、水果项、系数信息
Class Item Factor A Apples 3 A Peaches 2 A Pears 5 B NaN 4
需要在df2中新增Total列,计算规则:
- 仅
Class为A的行参与计算:取df1中10:00时刻、对应当前行Item的水果数值,乘以本行Factor值得到Total - 非A类行不执行计算,Total留空
期望输出结果:
Class Item Factor Total A Apples 3 9 A Peaches 2 4 A Pears 5 25 B NaN 4
原尝试代码存在语法和逻辑错误,无法得到正确结果:
df2['Total'] = df1.setIndex().cols.isin((df2.Item) and (df2.Class==A)) * df2.Factor
错误原因
原代码存在以下问题:
setIndex()方法名错误,且未指定要设为索引的列,pandas中设置索引的方法为set_index(列名)- pandas中条件逻辑与不能直接用
and,需要用&,且每个独立判断条件需要用括号包裹 - 整体逻辑错误:
isin只能判断值是否存在,无法按行匹配对应Item的数值做计算 - 字符串
A未加引号,会被识别为变量而非值
正确实现代码
首先提取df1中10:00时刻的水果数值映射,再按条件计算即可:
import pandas as pd import numpy as np # 提取10:00时刻的水果数值,转为{水果名:数值}的映射字典 ten_clock_data = df1[df1['Time'] == '10:00'].iloc[0].drop('Time').to_dict() # 修正列名拼写差异:df1中列名写为Peachs,df2中Item为Peaches,补全映射键避免匹配失败 ten_clock_data['Peaches'] = ten_clock_data.pop('Peachs') # 初始化Total列为空值 df2['Total'] = np.nan # 筛选Class为A的行 a_class_mask = df2['Class'] == 'A' # 仅对A类行计算Total:映射取对应水果数值 * 系数 df2.loc[a_class_mask, 'Total'] = df2.loc[a_class_mask, 'Item'].map(ten_clock_data) * df2.loc[a_class_mask, 'Factor']
运行后得到的df2和期望结果完全一致。
内容的提问来源于stack exchange,提问作者star_it8293
相关产品推荐
相关产品推荐

