2013-06-07 71 views
8

Tôi có DataFrame sau:Pandas: Kết hợp TimeGrouper với một lập luận groupby

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 

Làm thế nào tôi có thể nhóm dữ liệu này bằng các Chi nhánh và trên một khoảng thời gian 20 ngày sử dụng TimeGrouper?

Tất cả các lần thử trước đó của tôi không thành công, vì tôi không thể kết hợp TimeGrouper với một đối số khác trong hàm nhóm.

Tôi rất cảm kích sự giúp đỡ của bạn.

Cảm ơn bạn

Andy

+0

Áp dụng trên DataFrameNhóm từ TestGrouper dường như không hoạt động, ví dụ: 'g = df1.groupby (pd.TimeGrouper (freq = '20D')); g.apply (testgr); ': s Có lẽ đáng để đăng một github [issue] (https://github.com/pydata/pandas/issues/new). –

+0

Xin chào Andy, bạn đã thêm dòng chưa: từ pandas.tseries.resample nhập TimeGrouper. Tôi cập nhật ví dụ của tôi cho phù hợp – Andy

+0

Vâng, tôi có thể truy cập chức năng, vấn đề là groupby không có phương pháp .group vv –

Trả lời

4

Từ các cuộc thảo luận ở đây: 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 

Và một chút vấn đề phức tạp hơn

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 
14

Bây giờ bạn có thể sử dụng một TimeGrouper với cột khác (tại số IIRC gấu trúc 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 
Các vấn đề liên quan