【问题标题】:Pandas: Combine TimeGrouper with another Groupby argumentPandas:将 TimeGrouper 与另一个 Groupby 参数结合起来
【发布时间】:2013-06-03 15:48:15
【问题描述】:

我有以下数据框:

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 按 Branch 和 20 天的时间段对这些数据进行分组?

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

非常感谢您的帮助。

谢谢

安迪

【问题讨论】:

  • 从 TestGrouper 应用 DataFrameGroupby 似乎根本不起作用,例如g = df1.groupby(pd.TimeGrouper(freq='20D')); g.apply(testgr); :s 也许值得在 github 上发布 issue
  • 嗨,安迪,您是否添加了以下行:from pandas.tseries.resample import TimeGrouper。我相应地更新了我的示例
  • 是的,我可以访问该功能,问题是 groupby 没有 .group 方法等。

标签: python group-by pandas


【解决方案1】:

来自这里的讨论:https://github.com/pydata/pandas/issues/3791

In [38]: df.set_index('Date').groupby(pd.TimeGrouper('6M')).apply(lambda x: x.groupby('Branch').sum())
Out[38]: 
                   Quantity
           Branch          
2013-01-31 A              4
2014-01-31 A             22
           B              3

还有一个更复杂的问题

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

【讨论】:

    【解决方案2】:

    您现在可以将 TimeGrouper 与另一列一起使用(截至 IIRC pandas version 0.14):

    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
    

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多