python - 当数据框为长格式时,如何将列除以其在特定日期的值?
问题描述
我的数据框有 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 ...等等。我希望这是有道理的。
解决方案
您可以使用 选择想要的日期和列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')
推荐阅读
- asp.net - NLog 没有在 AWS ec2 Linux 中创建日志文件
- python - 如何为 Scrapy 请求添加默认 errback
- sql - 计算所有值,即使它们是重复的
- reactjs - React 应该是怎样的功能
- python - 如何在熊猫中按函数获取平均值
- python - 现在获得UTC的非天真(感知)日期时间的最简单方法是什么?
- python - matplotlib:如何在 0 到 255 的绝对灰度上绘制图像
- java - Docker Image 未正确启动
- cplex - 如何获得每个节点上所有小数变量的界限
- python-3.x - Scrapy 无法使用 Python 3 发布二进制正文