Python Pandas:将TimeGrouper与另一个Groupby参数组合

Python Pandas:将TimeGrouper与另一个Groupby参数组合,python,group-by,pandas,Python,Group By,Pandas,我有以下数据帧: df = pd.DataFrame({ 'Branch' : 'A A A A A B'.split(), '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,1,1,13,5), DT.datetime(2013,10,1,20,0), DT.datetime(2013

我有以下数据帧:

df = pd.DataFrame({
'Branch' : 'A A A A A B'.split(),
'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,1,1,13,5),
DT.datetime(2013,10,1,20,0),
DT.datetime(2013,10,2,10,0),
DT.datetime(2013,12,2,12,0),                                      
DT.datetime(2013,12,2,14,0),
]})

from pandas.tseries.resample import TimeGrouper
如何使用TimeGrouper按分支和20天周期对这些数据进行分组

我以前的所有尝试都失败了,因为我无法将TimeGrouper与groupby函数中的另一个参数组合

我将非常感谢你的帮助

多谢各位


安迪

这里的讨论:

还有一个更复杂的问题

In [55]: def testf(df):
   ....:     if (df['Buyer'] == 'Mark').sum() > 0:
   ....:         return Series(dict(quantity = df['Quantity'].sum(), buyer = 'mark'))
   ....:     return Series(dict(quantity = df['Quantity'].sum()*100, buyer = 'other'))
   ....: 

In [56]: df.set_index('Date').groupby(pd.TimeGrouper('6M')).apply(lambda x: x.groupby('Branch').apply(testf))
Out[56]: 
                   buyer quantity
           Branch                
2013-01-31 A        mark        4
2014-01-31 A       other     2200
           B       other      300

现在可以将TimeGrouper与另一列一起使用(从IIRC开始):


在TestGrouper的DataFrameGroupby上应用似乎根本不起作用,例如
g=df1.groupby(pd.TimeGrouper(freq='20D');g、 应用(testgr):s也许值得发布一个github。嗨,安迪,你添加了一行:from pandas.tseries.resample import timegropper。我相应地更新了我的示例是的,我可以访问该函数,问题是groupby没有.group方法等。
In [55]: def testf(df):
   ....:     if (df['Buyer'] == 'Mark').sum() > 0:
   ....:         return Series(dict(quantity = df['Quantity'].sum(), buyer = 'mark'))
   ....:     return Series(dict(quantity = df['Quantity'].sum()*100, buyer = 'other'))
   ....: 

In [56]: df.set_index('Date').groupby(pd.TimeGrouper('6M')).apply(lambda x: x.groupby('Branch').apply(testf))
Out[56]: 
                   buyer quantity
           Branch                
2013-01-31 A        mark        4
2014-01-31 A       other     2200
           B       other      300
In [11]: df1 = df.set_index('Date')

In [12]: g = df1.groupby([pd.TimeGrouper('20D'), 'Branch'])

In [13]: g.sum()
Out[13]:
                            Quantity
Date                Branch
2013-01-01 13:00:00 A              4
2013-09-18 13:00:00 A             13
2013-11-17 13:00:00 A              9
                    B              3