如何在Pandas DataFrame中按国家及类别条件计算Total Values列?
解决Pandas生成Total Values列的问题
先明确需求:
- 按
Country维度,把每个国家Category为Present的Values,和同国家非Present类别的Values相加,作为非Present行的Total Values Present类别的Total Values直接保留原Values值
你代码的问题
- 三层嵌套循环完全多余,Pandas是为向量化操作设计的,循环不仅效率低,还容易出错
- 赋值语句
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)
运行结果
| Country | Category | Values | Total Values |
|---|---|---|---|
| US | Present | 2000 | 2000 |
| US | Not Required | 2500 | 4500 |
| US | Not Present | 3000 | 5000 |
| US | Not Aware | 2550 | 4550 |
| IND | Present | 1000 | 1000 |
| JP | Present | 500 | 500 |
| CHINA | Present | 6000 | 6000 |
| CHINA | Not Present | 7000 | 13000 |
补充说明
如果每个国家可能存在多个Present类别,只需先按Country分组求和Present的Values,再做映射即可,代码修改如下:
present_values = df[df['Category'] == 'Present'].groupby('Country')['Values'].sum()
内容的提问来源于stack exchange,提问作者Manish Kumar Biswas
相关产品推荐
相关产品推荐

