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

长格式多索引DataFrame如何将列除以其在指定日期的对应取值?

解决方案

你之前代码报错的核心原因是:groupby返回的是分组对象,而非可直接索引的Series/DataFrame,因此无法直接调用.loc属性。我们可以通过以下两种方式实现需求:

方法1:groupby + transform (简洁写法)

transform方法会将分组计算得到的标量基准值,广播到对应分组的所有行,自动和原数据长度对齐:

import pandas as pd

# 定义基准日期
t = '2020-07-01'

df['d2'] = df['d'] / df.groupby(level='country')['d'].transform(
    lambda group: group.xs(key=t, level='date').iloc[0]
)

方法2:预提取基准值(高性能写法,适合大数据量)

提前把所有国家在基准日的取值提取出来,再按国家索引对齐后做除法,避免分组逐组运算的开销:

t = '2020-07-01'
# 提取基准日各国家的d值,返回索引为country的Series
base_series = df.xs(key=t, level='date')['d']
# 按原数据的country索引对齐基准值后做除法
df['d2'] = df['d'] / base_series.reindex(df.index.get_level_values('country')).values

效果说明

用你提供的示例数据运行上述代码后:

  • US分组在2020-07-01的d2取值为1,其余日期取值为当日d值除以100.957790
  • IL分组在2020-07-01的d2取值为1,其余日期取值为当日d值除以101.168879
    完全符合你要求的重缩放规则。

小提示:如果部分国家不存在基准日的观测值,对应分组的所有d2结果会返回NaN,可以提前用dropna或者fillna处理基准值序列避免异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:54:06