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

如何在Pandas DataFrame中按国家及类别条件计算Total Values列?

解决Pandas生成Total Values列的问题

先明确需求:

  • 按Country维度,把每个国家Category为Present的Values,和同国家非Present类别的Values相加,作为非Present行的Total Values
  • Present类别的Total Values直接保留原Values值

你代码的问题

  1. 三层嵌套循环完全多余,Pandas是为向量化操作设计的,循环不仅效率低,还容易出错
  2. 赋值语句df['Total Values']= df['Values]+ df['Values][j]有语法错误(df['Values]少了闭合引号,df['Values][j]的索引写法不规范),而且每次循环都会覆盖整个Total Values列,最后得到的只是最后一次循环的计算结果,自然不符合预期

正确解法

用Pandas的分组、映射和条件判断来实现,代码简洁高效:

import pandas as pd

data = {'Country': ['US','US','US','US','IND','JP',
                     'CHINA','CHINA'],
        'Category': ['Present','Not Required','Not Present','Not Aware','Present','Present','Present','Not Present'],
       'Values':[2000,2500,3000,2550,1000,500,6000,7000]}
df = pd.DataFrame(data)

# 提取每个国家的Present对应Values值,生成映射关系
present_values = df[df['Category'] == 'Present'].set_index('Country')['Values']

# 将每个国家的Present值匹配到原DataFrame的每一行
df['Present_Value'] = df['Country'].map(present_values)

# 根据Category生成Total Values列
df['Total Values'] = df.apply(lambda row: row['Values'] if row['Category'] == 'Present' else row['Present_Value'] + row['Values'], axis=1)

# 可按需删除中间辅助列
df.drop('Present_Value', axis=1, inplace=True)

print(df)

运行结果

CountryCategoryValuesTotal Values
USPresent20002000
USNot Required25004500
USNot Present30005000
USNot Aware25504550
INDPresent10001000
JPPresent500500
CHINAPresent60006000
CHINANot Present700013000

补充说明

如果每个国家可能存在多个Present类别,只需先按Country分组求和Present的Values,再做映射即可,代码修改如下:

present_values = df[df['Category'] == 'Present'].groupby('Country')['Values'].sum()

内容的提问来源于stack exchange,提问作者Manish Kumar Biswas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:23:19