Pandas Groupby / Grouper group开始索引值

时间:2016-07-10 18:16:20

标签: python pandas group-by

如何调整Grouper的开始时间?

从这个样本DF开始:

import datetime as DT
df = pd.DataFrame({
'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(),
'Quantity': [1,3,5,8,9,3],
'Date' : [
DT.datetime(2013,1,1,13,0),
DT.datetime(2013,3,1,13,5),
DT.datetime(2013,5,1,20,0),
DT.datetime(2013,8,2,10,0),
DT.datetime(2013,9,2,12,0),                                      
DT.datetime(2013,11,2,14,0),
]})
df = df.set_index('Date')

df.groupby(pd.Grouper(freq='1MS'))["Quantity"].count()

   Date
2013-01-01    1
2013-02-01    0
2013-03-01    1
2013-04-01    0
2013-05-01    1
2013-06-01    0
2013-07-01    0
2013-08-01    1
2013-09-01    1
2013-10-01    0
2013-11-01    1

df.groupby(pd.Grouper(freq='2MS'))["Quantity"].count()

   Date
2013-01-01    1
2013-03-01    1
2013-05-01    1
2013-07-01    1
2013-09-01    1
2013-11-01    1

我在索引日期使用"2MS"查找的是Grouper or TimeGrouper。以上是从索引中的第一个值或2013年1月1日返回"2MS"。如何从2MS获取'8/1/2013' 2。

定位:

     Date
2013-01-01    1
2013-03-01    1
2013-05-01    1
2013-08-01    2
2013-09-01    1
2013-11-01    1

注意:

我尝试根据索引值进行分组... - 第一组将从1/1开始切片。第二个切片将从3/1开始,第三个切片从5/1开始。结束时期为2MS。现在使用Grouper,它从第一个日期开始切片,并以两个月的间隔继续。第四个间隔应从8/1结束10/2开始。现在,8/2从7/1开始。

1 个答案:

答案 0 :(得分:0)

您想要一个向前滚动窗口,而pandas向后滚动窗口。因此,我们的想法是颠倒你的系列的顺序,采取滚动窗口,然后恢复排序。

这就是你已经拥有的:

from datetime import datetime

import pandas as pd

df = pd.DataFrame({'Buyer': 'Carl Mark Carl Joe Joe Carl'.split(),
                   'Quantity': [1, 3, 5, 8, 9, 3],
                   'Date' : [datetime(2013, 1, 1, 13, 0),
                             datetime(2013, 3, 1, 13, 5),
                             datetime(2013, 5, 1, 20, 0),
                             datetime(2013, 8, 2, 10, 0),
                             datetime(2013, 9, 2, 12, 0),                                      
                             datetime(2013, 11, 2, 14, 0)]})
df = df.set_index('Date')
print(df)

#                     Buyer  Quantity
# Date                               
# 2013-01-01 13:00:00  Carl         1
# 2013-03-01 13:05:00  Mark         3
# 2013-05-01 20:00:00  Carl         5
# 2013-08-02 10:00:00   Joe         8
# 2013-09-02 12:00:00   Joe         9
# 2013-11-02 14:00:00  Carl         3

g1 = df.resample('MS')["Quantity"].count()
print(g1)

# Date
# 2013-01-01    1
# 2013-02-01    0
# 2013-03-01    1
# 2013-04-01    0
# 2013-05-01    1
# 2013-06-01    0
# 2013-07-01    0
# 2013-08-01    1
# 2013-09-01    1
# 2013-10-01    0
# 2013-11-01    1
# Freq: MS, Name: Quantity, dtype: int64

这就是如何到达终点线:

g2 = g1.sort_index(ascending=False).rolling(2, 0).sum().sort_index()
print(g2)

# Date
# 2013-01-01    1.0
# 2013-02-01    1.0
# 2013-03-01    1.0
# 2013-04-01    1.0
# 2013-05-01    1.0
# 2013-06-01    0.0
# 2013-07-01    1.0
# 2013-08-01    2.0
# 2013-09-01    1.0
# 2013-10-01    1.0
# 2013-11-01    1.0
# Freq: MS, Name: Quantity, dtype: float64

print(g2[g1 != 0].astype(int))

# Date
# 2013-01-01    1
# 2013-03-01    1
# 2013-05-01    1
# 2013-08-01    2
# 2013-09-01    1
# 2013-11-01    1
# Name: Quantity, dtype: int64