首页 > 解决方案 > 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 的行,因此最终不会有更多重复的日期索引?

标签: pythonpandasdataframe

解决方案


您可以将您的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

推荐阅读