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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:42:25