考虑如下的数据框
ID A B date
0 0C0003fi8E 6 10 2015-04-01
1 0C0AD3fi4S 10 15 2015-04-01
2 0C0AD3flmn 60 22 2015-04-01
3 0C0003fi8E 10 40 2015-04-02
4 0C0AD3fi4S 8 15 2015-04-02
5 0CaAD3flmn 33 18 2015-04-02
6 0C0003fi8E 10 19 2015-04-03
7 0C0AD3fi4S 8 25 2015-04-03
8 0CaAD3flmn 33 20 2015-04-03
9 0C0003fi8E 75 11 2015-04-04
10 0C0AD3fi4S 4 37 2015-04-04
11 0CaAD3flmn 28 80 2015-04-04
...
我需要连续两天为每个 ID汇总A
和B
。
对于每A
和每X天,结果应该是B
和ID
的一个值。
例如,在ID
上使用每两天的采样频率:
ID A B date
0C0003fi8E 16 50 2015-04-01
0C0AD3fi4S 18 30 2015-04-01
0C0AD3flmn 93 40 2015-04-01
0C0003fi8E 95 30 2015-04-03
0C0AD3fi4S 12 52 2015-04-03
0CaAD3flmn 61 100 2015-04-03
我怎么能在熊猫中做到这一点?
如果我想使用更灵活的时间段重新采样,该怎么办?例如。每周,或每月? resample
可以用于此吗?
答案 0 :(得分:3)
如果您将日期设置为索引,则可以使用TimeGrouper:
In [11]: df1.groupby(["ID", pd.TimeGrouper("d")]).sum()
Out[11]:
A B
ID date
0C0003fi8E 2015-04-01 6 10
2015-04-02 10 40
2015-04-03 10 19
2015-04-04 75 11
0C0AD3fi4S 2015-04-01 10 15
2015-04-02 8 15
2015-04-03 8 25
2015-04-04 4 37
0C0AD3flmn 2015-04-01 60 22
0CaAD3flmn 2015-04-02 33 18
2015-04-03 33 20
2015-04-04 28 80
In [12]: df1.groupby(["ID", pd.TimeGrouper("2d")]).sum()
Out[12]:
A B
ID date
0C0003fi8E 2015-04-01 16 50
2015-04-03 85 30
0C0AD3fi4S 2015-04-01 18 30
2015-04-03 12 62
0C0AD3flmn 2015-04-01 60 22
0CaAD3flmn 2015-04-01 33 18
2015-04-03 61 100
注意:如有必要,您可以reset_index
转换索引列。
这不是明确的文档,而是several examples in the cookbook。
答案 1 :(得分:1)
您可以按照以下方式每周或每月轻松重新采样(每周显示):
>>> df.groupby(['date', 'ID']).sum().unstack().resample('1W').stack()
A B
date ID
2015-04-05 0C0003fi8E 25.250000 20.000000
0C0AD3fi4S 7.500000 23.000000
0C0AD3flmn 60.000000 22.000000
0CaAD3flmn 31.333333 39.333333
关于您的初始请求,目前尚不清楚您希望如何处理日期中的差距。例如,您想要在连续的日历日或连续的每日观察中进行分组吗?
这是一种方法:
df2 = df.groupby(['date', 'ID']).sum().unstack('ID')
>>> (df2.iloc[::2, :] + df2.iloc[1::2, :].values).stack('ID')
A B
date ID
2015-04-01 0C0003fi8E 16 50
0C0AD3fi4S 18 30
2015-04-03 0C0003fi8E 85 30
0C0AD3fi4S 12 62
0CaAD3flmn 61 100