Pandas - MultiIndex 重采样 - 我不想丢失其他索引的信息

1 投票
1 回答
40 浏览
提问于 2025-04-13 01:43

我有一个这样的数据表:

                        value
A   B
111 2024-03-22 00:00:00 1
111 2024-03-22 01:00:00 2
111 2024-03-22 02:00:00 3
222 2024-03-22 00:00:00 4
222 2024-03-22 01:00:00 5
222 2024-03-22 02:00:00 6

现在我想把索引B按天重新采样并求和,期望得到以下结果:

                        value
A   B
111 2024-03-22 00:00:00 6
222 2024-03-22 00:00:00 15

我该怎么做才能实现这个呢?

另一个例子是这样的:

                        value
A   B
111 2024-03-22 00:00:00 1
111 2024-03-22 01:00:00 2
111 2024-03-22 02:00:00 3
222 2024-03-22 00:00:00 4
222 2024-03-22 01:00:00 5
222 2024-03-22 02:00:00 6
333 2024-03-22 05:00:00 7

我想要通过每小时重新采样得到以下结果:

                        value
A   B
111 2024-03-22 00:00:00 1
111 2024-03-22 01:00:00 2
111 2024-03-22 02:00:00 3
111 2024-03-22 03:00:00 0
111 2024-03-22 04:00:00 0
111 2024-03-22 05:00:00 0
222 2024-03-22 00:00:00 4
222 2024-03-22 01:00:00 5
222 2024-03-22 02:00:00 6
222 2024-03-22 03:00:00 0
222 2024-03-22 04:00:00 0
222 2024-03-22 05:00:00 0
333 2024-03-22 00:00:00 0
333 2024-03-22 01:00:00 0
333 2024-03-22 02:00:00 0
333 2024-03-22 03:00:00 0
333 2024-03-22 04:00:00 0
333 2024-03-22 05:00:00 7

Pandas版本:2.0.1

我尝试在重新采样时使用level,但这样会丢失索引A。

当我有两个时间戳在索引中,并想把一个按天重新采样,另一个按小时重新采样时,我也遇到了同样的问题。

我查看了这里其他相关问题的答案,但找不到适合我的解决办法。

我自己都搞糊涂了,可能是我没有看到正确的实现方法。 :)

如果你需要更多信息,请告诉我。

提前谢谢你。

问候,Oliver

1 个回答

3

在进行resample操作之前,你需要先用groupby把数据分组,这样才能保留A这个索引。

import pandas as pd

df = pd.DataFrame.from_dict({'value': 
 {(111, pd.Timestamp('2024-03-22 00:00:00')): 1,
  (111, pd.Timestamp('2024-03-22 01:00:00')): 2,
  (111, pd.Timestamp('2024-03-22 02:00:00')): 3,
  (222, pd.Timestamp('2024-03-22 00:00:00')): 4,
  (222, pd.Timestamp('2024-03-22 01:00:00')): 5,
  (222, pd.Timestamp('2024-03-22 02:00:00')): 6}}
)

df.groupby(level=0).resample('d', level=1).sum()
# returns:
                value
A   B
111 2024-03-22      6
222 2024-03-22     15

撰写回答