gpt4 book ai didi

python - 如何滚动窗口聚合但保留 Pandas 中的唯一索引列?

转载 作者:行者123 更新时间:2023-12-05 05:09:44 33 4
gpt4 key购买 nike

我想滚动窗口聚合一个数据框,但我的结果保留一个具有唯一索引的列是至关重要的,因为稍后我想将我的聚合连接回原始数据框。

很喜欢

df = pd.DataFrame(
{"id": range(6),
"t": [pd.Timestamp("2019-01-01")+dt.timedelta(seconds=sec) for sec in [2, 2, 1, 1, 1, 1]],
"gr": list("ababab"),
"val": range(6)})

agg = df.groupby("gr").rolling("2s", on="t")["val"].sum() # <- id not present anymore

现在我想在 id 上加入 agg 回到 df 但不幸的是 Pandas rolling 使 t 多索引的级别。 (时间t其实不是唯一的)

有什么方法可以在 agg 中获取 id 吗?

看着

>>> df.sort_values(["gr", "t"])
id t gr val
2 3 2019-01-01 00:00:01 a 2
4 1 2019-01-01 00:00:01 a 4
0 5 2019-01-01 00:00:02 a 0
3 2 2019-01-01 00:00:01 b 3
5 0 2019-01-01 00:00:01 b 5
1 4 2019-01-01 00:00:02 b 1

预期的总和应该是

   id                   t gr  sum_val
2 3 2019-01-01 00:00:01 a 2
4 1 2019-01-01 00:00:01 a 6
0 5 2019-01-01 00:00:02 a 6
3 2 2019-01-01 00:00:01 b 3
5 0 2019-01-01 00:00:01 b 8
1 4 2019-01-01 00:00:02 b 9

但是,一个建议的解决方案的输出是

agg = df.sort_values("t").groupby(['gr']).rolling("2s", on="t")['val'].sum().reset_index(name='sum_val')
agg['id'] = df.sort_values(['gr'])['id'].values
agg.sort_values(["gr", "t"])

输出:

  gr                   t  sum_val  id
0 a 2019-01-01 00:00:01 2.0 5
1 a 2019-01-01 00:00:01 6.0 3
2 a 2019-01-01 00:00:02 6.0 1
3 b 2019-01-01 00:00:01 3.0 4
4 b 2019-01-01 00:00:01 8.0 2
5 b 2019-01-01 00:00:02 9.0 0

gr='a'id=5 应该是 6?!

更新:我使时间更加重复以证明问题。更新:将 t 设为时间列,因为在此之前它没有做它应该做的事情。

最佳答案

由于 t 在组内不是唯一的,但 id 是唯一的,并且您在 gr 上分组,您可以:

agg = df.groupby(['gr']).rolling(2, on="t")['val'].sum().reset_index(name='sum_val')
agg['id'] = df.sort_values(['gr'])['id'].values

输出:

    gr  t   sum_val id
0 a 1 NaN 0
1 a 1 2.0 2
2 a 2 6.0 4
3 b 1 NaN 1
4 b 1 4.0 3
5 b 2 8.0 5

如果t是唯一的,你可以这样做:

可以和原来的df合并回去

df.groupby(['gr']).rolling(2, on="t")['val'].sum().reset_index(name='sum_val').merge(df[['id', 't', 'gr']])

输出:

    gr  t   sum_val id
0 a 1 NaN 0
1 a 2 2.0 2
2 a 3 6.0 4
3 b 1 NaN 1
4 b 2 4.0 3
5 b 3 8.0 5

关于python - 如何滚动窗口聚合但保留 Pandas 中的唯一索引列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57315522/

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