熊猫使用分组依据

时间:2018-10-04 21:45:42

标签: python pandas date indexing

我有一系列与此表类似的交易:

ID  Customer    Date    Amount
1   A        6/12/2018  33,223.00
2   A        9/20/2018  635.00
3   B        8/3/2018   8,643.00
4   B        8/30/2018  1,231.00
5   C        5/29/2018  7,522.00

但是我需要获取最近六个月(截至今天)的平均金额

我正在使用

df.groupby('Customer').resample('W')['Amount'].sum()

得到这样的东西:

CustomerCode  PayDate   
A             2018-05-21                    268
              2018-05-28                   0.00
              2018-06-11                   0.00
              2018-06-18                472,657
              2018-06-25                   0.00

但是,使用此解决方案,我只能得到客户有付款的日期范围。我需要为每个客户延长周数,以便获得六个月的全部范围(以周为单位)。在此示例中,我需要从'2018-04-05'的那一周(恰好是今天的六个月前)到今天的一周(今天是0,因为没有金额)为客户A获取< / p>

2 个答案:

答案 0 :(得分:0)

重采样非常灵活。要获得6个月而不是每周的总和,您目前所需要的是:

df.groupby('Customer').resample('6M')['Amount'].sum()

按月末分组;月开始时间为'6MS'

有关可用频率的更多文档可在此处找到: http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases

答案 1 :(得分:0)

这是我找到的解决方案。首先,我创建所需的日期(过去六个月,但以周为单位)

$ awk -F"#" '{ for (i = 2; i <= NF; i+=2) { print $i } }' <<< "something#ABC#else something#DEF#else"
ABC
DEF

然后我使用带有日期的客户产品创建一个多索引。

dates = pd.date_range(datetime.date.today() - datetime.timedelta(6*365/12),
                      pd.datetime.today(),
                      freq='W')

然后,我使用新创建的多索引对df重新编制索引,最后,我用零填充缺失值。

multi_index = pd.MultiIndex.from_product([pd.Index(df['Customer'].unique()), 
                                          dates], 
                                         names=('Customer', 'Date'))