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

如何获取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}")

关键逻辑说明

  1. stack()方法:把DataFrame转换成Series,索引变成(行标签,列标签)的多级索引,这样用idxmax()就能直接拿到最大值的位置元组
  2. 年份对应关系:因为diff(axis='columns')计算的是当前列与前一列的差值,所以差值所在的列对应的是变化的后一年,前一列是变化的前一年
  3. 大小写处理:统一把省份列和输入转成小写,确保不区分大小写的匹配生效

这样调用函数后,就能得到你需要的四个结果:最大差值、对应地区、变化的起始年份和结束年份啦!

内容的提问来源于stack exchange,提问作者dragon95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:36:03