首页 > 解决方案 > 当数据框为长格式时,如何将列除以其在特定日期的值?

问题描述

我的数据框有 2 个索引,日期和国家。我们将数据列称为“d”。

我想要做的是将'd'中的数据除以'd'在某个固定日期t的值。基本上我想重新调整系列,使其在日期 t 的值为 1。

我试过groupby:

df['d2'] = df['d']/df.groupby(level='country')['d'].loc['t']

这当然会失败,因为 groupby 没有属性 .loc。我应该在这里做什么?

编辑:我的数据框示例

date        country
2020-04-01  US          93.872715
2020-07-01  US         100.957790
2020-10-01  US         102.083749
2021-01-01  US         103.649602
2021-04-01  US         105.350228
   
2020-07-01  IL         101.168879
2020-10-01  IL         103.576224
2021-01-01  IL         103.212359
2021-04-01  IL         107.240892
2021-07-01  IL                NaN

我想按日期“2020-07-01”的值缩放数据,以便美国数据应为 93.87/100.96、1、102.08/100.96...,对于 IL,为 101.17/103.58、1、103.21/ 103.58 ...等等。我希望这是有道理的。

标签: pythonpandas

解决方案


您可以使用 选择想要的日期和列loc,然后map选择国家级索引。将 d 列除以这个

df['norm_d'] = df['d']/df.index.get_level_values('country').map(df.loc['2020-07-01','d'])
print(df)
                             d    norm_d
date       country                      
2020-04-01 US        93.872715  0.929821
2020-07-01 US       100.957790  1.000000
2020-10-01 US       102.083749  1.011153
2021-01-01 US       103.649602  1.026663
2021-04-01 US       105.350228  1.043508
2020-07-01 IL       101.168879  1.000000
2020-10-01 IL       103.576224  1.023795
2021-01-01 IL       103.212359  1.020199
2021-04-01 IL       107.240892  1.060019

在这里看看发生了什么

print(df.loc['2020-07-01','d'])
# country
# US    100.957790
# IL    101.168879
# Name: d, dtype: float64

print(df.index.get_level_values('country').map(df.loc['2020-07-01','d']))
# Float64Index([ 100.95779,  100.95779,  100.95779,  100.95779,  100.95779,
#               101.168879, 101.168879, 101.168879, 101.168879],
#              dtype='float64', name='country')

推荐阅读