如何使用Python Pandas获取各地区死亡率最高的对应年份
解决Pandas DataFrame中获取每行最大值对应列名(年份)的问题
嘿,我完全懂你的困扰!你用df.max(axis=1)只能拿到每个地区的最高死亡率数值,却没法对应到具体的年份——这确实是因为max()方法只返回值,不返回其所在的列索引。不过Pandas有专门的工具能帮你搞定这个需求,下面给你两种简单实用的方案:
方案一:用idxmax()直接获取对应年份,再合并数值
idxmax(axis=1)是Pandas里专门用来找每行最大值所在列名的方法(你的列正好是年份,完美匹配)。结合max()就能同时得到年份和对应的死亡率:
import pandas as pd # 假设你的数据集是这样的结构(示例) data = { '地区': ['北京', '上海', '广州'], '2018': [7.2, 6.8, 7.0], '2019': [7.5, 7.1, 7.3], '2020': [7.3, 7.5, 7.2] } df = pd.DataFrame(data).set_index('地区') # 获取每个地区死亡率最高的年份 max_year = df.idxmax(axis=1) # 获取对应的最高死亡率数值 max_mortality = df.max(axis=1) # 合并成一个清晰的结果DataFrame result = pd.DataFrame({ '最高死亡率年份': max_year, '最高死亡率': max_mortality }) print(result)
运行后你会得到这样的结果:
最高死亡率年份 最高死亡率 地区 北京 2019 7.5 上海 2020 7.5 广州 2019 7.3
方案二:用apply()自定义函数返回完整信息
如果你想更灵活地处理(比如后续要加更多逻辑),可以用apply()对每行自定义处理:
def get_max_mortality_info(row): # 拿到当前行的最高死亡率 max_val = row.max() # 拿到对应的年份(列名) max_year = row.idxmax() # 返回Series方便合并成DataFrame return pd.Series([max_year, max_val], index=['最高死亡率年份', '最高死亡率']) # 对每行应用函数 result = df.apply(get_max_mortality_info, axis=1) print(result)
特殊情况处理:多个年份死亡率相同
如果某个地区有多个年份死亡率一样高,idxmax()只会返回第一个出现的年份。如果你需要所有对应的年份,可以把函数改成这样:
def get_all_max_years(row): max_val = row.max() # 筛选出所有等于最大值的列名(年份),转成列表 max_years = row[row == max_val].index.tolist() return pd.Series([max_years, max_val], index=['所有最高死亡率年份', '最高死亡率']) result = df.apply(get_all_max_years, axis=1)
这样就能拿到所有对应年份的列表啦!
内容的提问来源于stack exchange,提问作者I AM A Hacker
相关产品推荐
相关产品推荐

