python - pandas 中的 df.align() 是插入缺失日期行同时保留重复日期行的最佳解决方案吗
问题描述
我的数据是数据框中的 STRAVA 活动,索引设置为活动日期。我想插入用丢失的日期索引的行,即我的数据框将以原始数据中从最旧到最新的天数进行索引。我在这里的其他两个帖子中尝试了以下方法, 将缺失的日期添加到 pandas 数据框,这里 的pandas 在时间序列中填充缺失的日期
但是我遇到的问题如下。因为在某些日期发生了两个活动,所以该行的索引标签不再是唯一的并且是重复的。
2020-12-20 8.00000
2020-12-20 7.00000
2020-12-22 6.50000
2020-12-22 9.00000
2020-12-23 4.00000
2020-12-24 3.00000
因此,当我运行 df.reindex(index=pd.date_range(df.index.min(),df.index.max(),fill=0 时,我插入了日期但丢失了重复项。与 df.index 类似。 asfreq("D"). 我遇到了同样的问题。
我发现的唯一解决方案是使用 df.align() 作为一系列索引标签的解析,频率如下。然后我返回元组中的第一个数据帧,产生以下结果。
dates = pd.date_range(df.index.min(), df.index.max(), freq = "D")
ts = pd.Series(np.random.randint(0,500), len(dates)), index=dates)
tuple = df.align(ts, axis=0)
newdf = tuple[0]
2020-12-20 8.00000
2020-12-20 7.00000
2020-12-20 NaN
2020-12-21 NaN
2020-12-22 6.50000
2020-12-22 9.00000
2020-12-22 NaN
2020-12-23 4.00000
2020-12-23 NaN
2020-12-24 3.00000
2020-12-24 NaN
这是唯一的解决方案吗?有没有办法忽略重复索引但继续插入日期为 MISSING 的行,因此最终不会有更多重复的日期索引?
解决方案
您可以将您的date
系列制作成数据框并左合并。
import pandas as pd
dates = pd.date_range('2020-12-20', '2020-12-24', freq = "D").to_frame(name='date')
ts = pd.DataFrame({'date': {0: '2020-12-20',
1: '2020-12-20',
2: '2020-12-22',
3: '2020-12-22',
4: '2020-12-23',
5: '2020-12-24'},
'value': {0: 8.0, 1: 7.0, 2: 6.5, 3: 9.0, 4: 4.0, 5: 3.0}})
ts['date'] = pd.to_datetime(ts['date'])
dates.merge(ts, on='date', how='left')
输出
date value
0 2020-12-20 8.0
1 2020-12-20 7.0
2 2020-12-21 NaN
3 2020-12-22 6.5
4 2020-12-22 9.0
5 2020-12-23 4.0
6 2020-12-24 3.0
推荐阅读
- kubernetes-helm - Helm 依赖库与缓存
- cmd - CMD 目录:我可以使用 * 代替子文件夹
- c# - 如何使用 C# 发送特定文本背面以在纸张上打印?
- c# - How do I stop this error when using backspace in textbox?
- javascript - TypeError:无法读取 null 的属性“isPaused”
- java - 使用 Jackson 将 POJO 序列化为带有命名空间和嵌套元素的 XML
- node.js - 如何流式传输到 Promise?
- range - iid随机变量之和的范围函数是凸的吗?
- javascript - 使用 sinon 对 TypeScript void 函数进行单元测试
- html - 无法响应来自 HTML 表单的 POST 请求