使用Pandas筛选透视表报错:获取指定国家TB最高发病年份及病例数
问题分析与解决方案
错误原因
你的代码报错源于两个核心问题:
idxmax()参数方向错误:默认axis=0是按列找最大值对应的国家,但你需要按行(国家)找最大值对应的年份,必须指定axis=1。- mask逻辑不匹配:
highest_cases_year是每个国家对应一个年份(长度3),而total_cases_pivot.columns是14个年份,直接用==比较会触发形状不匹配的广播错误。
修正后的代码
import pandas as pd # 假设total_cases_pivot是已创建的透视表 countries = ['United States of America', 'China', 'India'] # 1. 获取每个国家病例数最高的年份(按行计算最大值对应的列) highest_year = total_cases_pivot.loc[countries].idxmax(axis=1) # 2. 提取对应年份的病例数 highest_count = total_cases_pivot.loc[countries].lookup(highest_year.index, highest_year.values) # 3. 合并为结构化DataFrame result = pd.DataFrame({ '最高病例年份': highest_year.values, '对应病例数': highest_count }, index=countries) print(result)
代码说明
idxmax(axis=1):针对每个国家(行),定位病例数最高的年份(列名)。lookup():通过国家索引和对应年份精准提取数值,彻底避免广播不匹配问题。- 最终生成的DataFrame会清晰展示每个国家的最高病例年份及对应数值。
兼容旧版本Pandas的替代方案
如果你的Pandas版本不支持lookup(新版本已标记弃用),可以用apply实现:
def extract_highest(row): max_year = row.idxmax() return pd.Series([max_year, row[max_year]], index=['最高病例年份', '对应病例数']) result = total_cases_pivot.loc[countries].apply(extract_highest, axis=1) print(result)
内容的提问来源于stack exchange,提问作者Tinotenda Mhlanga
相关产品推荐
相关产品推荐

