长格式多索引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
相关产品推荐
相关产品推荐

