如何获取DataFrame中max_val对应的行列标签及阿尔伯塔省最大列间差值
解决获取最大列间差值对应行列标签的问题
我来帮你搞定这个问题!你已经算出了最大差值max_val,现在只需要调整一下获取位置的逻辑,就能拿到对应的地区(行标签)和变化的两个年份了。咱们先梳理下原代码里的小问题,再给出完整的修正方案:
原代码里的几个待修正点
- 省份匹配时大小写不一致:你把
province列转成了小写,但筛选时还是用原输入的province,会导致匹配失败 - 获取最大值位置的逻辑错误:
c_r那行的写法不对,没法正确定位到最大值的行列 - 多余的DataFrame转换:
pd.read_csv已经返回DataFrame了,不用再转一次
修正后的完整代码
import pandas as pd def find_max(province): # 读取数据 df = pd.read_csv('Canada.csv') # 统一省份列的大小写,实现不区分大小写匹配 df['province'] = df['province'].astype(str).str.lower() prov_lower = province.lower() if prov_lower in df['province'].values: # 筛选目标省份的数据 province_data = df[df['province'] == prov_lower] # 计算列间差值(后一年减前一年),取绝对值 # 注意:diff后第一列会是NaN,不影响后续找最大值 pct_change = province_data.iloc[:, 3:-1].diff(axis='columns').abs() # 找到最大差值 max_val = pct_change.stack().max() # 获取最大值对应的行标签(地区)和列标签(差值所在列) max_loc = pct_change.stack().idxmax() region = max_loc[0] diff_col = max_loc[1] # 获取产生该变化的两个年份:差值列的前一列和当前列 year_cols = pct_change.columns.tolist() diff_col_idx = year_cols.index(diff_col) prev_year = year_cols[diff_col_idx - 1] curr_year = diff_col return max_val, region, prev_year, curr_year else: raise ValueError(f"Province '{province}' not found in the data!") # 调用示例 max_diff, region, year_from, year_to = find_max('alberta') print(f"最大差值:{max_diff}") print(f"对应地区:{region}") print(f"变化年份:{year_from} → {year_to}")
关键逻辑说明
stack()方法:把DataFrame转换成Series,索引变成(行标签,列标签)的多级索引,这样用idxmax()就能直接拿到最大值的位置元组- 年份对应关系:因为
diff(axis='columns')计算的是当前列与前一列的差值,所以差值所在的列对应的是变化的后一年,前一列是变化的前一年 - 大小写处理:统一把省份列和输入转成小写,确保不区分大小写的匹配生效
这样调用函数后,就能得到你需要的四个结果:最大差值、对应地区、变化的起始年份和结束年份啦!
内容的提问来源于stack exchange,提问作者dragon95
相关产品推荐
相关产品推荐

