gpt4 book ai didi

python - pandas index.asof 与多索引

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:56 25 4
gpt4 key购买 nike

我有每个实体的时间序列数据:

id  event_date  value
1 2013-12-21 3.82
1 2013-12-22 2.47
1 2013-12-25 2.13
1 2014-01-03 3.92
1 2014-01-04 2.48
2 2014-10-16 3.96
2 2014-10-17 3.61
2 2014-10-29 2.59
2 2014-11-05 3.64
2 2014-11-15 2.85

我已将其放入具有多重索引的数据框中:

               value
id event_date
1 2013-12-21 3.82
2013-12-22 2.47
2013-12-25 2.13
2014-01-03 3.92
2014-01-04 2.48
2 2014-10-16 3.96
2014-10-17 3.61
2014-10-29 2.59
2014-11-05 3.64
2014-11-15 2.85

我试图找到每个 id 系列中任意截止之前的最新日期(例如 2014-10-31 或 2014-09-30 之前)。 index.asof 或 Series.asof 似乎是我想要的,但我不知道如何将它与多个索引一起使用。对于“2014-10-30”的日期,我想要以下输出:

id  event_date
1 2014-01-04 00:00:00
2 2014-10-29 00:00:00

我可以通过循环第一级索引来到达那里,但似乎应该有一种更好的更简单的方式(完整的数据集非常大),而我只是错过了它。

In [10]: for idx in df.index.levels[0]:
....: print idx, df.loc[idx].index.asof('2014-10-30')
....:
1 2014-01-04 00:00:00
2 2014-10-29 00:00:00

没有理由数据必须处于这种多索引结构中,鉴于每个 id 都有一个时间序列,这似乎是有意义的。时间已排序,没有重复。

版本: Pandas :0.15.0numpy:1.9.0

最佳答案

在我看来,@gjreda 的答案只是缺少您的截止过滤器,因此假设 event_dateid 在索引中:

cutoff = '2014-10-30'
df[df['event_date'] <= cutoff].groupby(['id'])['event_date'].last()

这给出了与之前相同的输出,但截止是任意的:

id
1 2014-01-04
2 2014-10-29
Name: event_date, dtype: datetime64[ns]

如果您仍然想在索引中使用这些列,您可以这样做:

df[df.index.levels[1] <= cutoff].groupby(level=['id']).apply(lambda x: x.index.get_level_values(1).max())

顺便说一句,当应用于 groupby 数据帧时,似乎 .asof 会评估整个索引而不是组的索引,因此您的 asof 版本 未按预期工作:

df[df.index.levels[1] <= cutoff].groupby(level=[0]).apply(lambda x: x.index.levels[1].asof(cutoff))

返回:

id
1 2014-10-29
2 2014-10-29
dtype: datetime64[ns]

看起来它使用了所有组的最后一个真实值。

关于python - pandas index.asof 与多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com