Pandas groupby datetime,获取计数和价格

时间:2016-09-22 19:37:33

标签: python pandas

我正在尝试使用pandas按订阅类型对订阅者进行分组,并获得当天订阅类型的平均价格。我的数据类似于:

Sub_Date             Sub_Type    Price 
2011-03-31 00:00:00  12 Month    331.00
2012-04-16 00:00:00  12 Month    334.70
2013-08-06 00:00:00  12 Month    344.34
2014-08-21 00:00:00  12 Month    362.53
2015-08-31 00:00:00  6 Month     289.47
2016-09-03 00:00:00  6 Month     245.57
2013-04-10 00:00:00  4 Month     148.79
2014-03-13 00:00:00  12 Month    348.46
2015-03-15 00:00:00  12 Month    316.86
2011-02-09 00:00:00  12 Month    333.25
2012-03-09 00:00:00  12 Month    333.88
...
2013-04-03 00:00:00  12 Month    318.34
2014-04-15 00:00:00  12 Month    350.73
2015-04-19 00:00:00  6 Month     291.63
2016-04-19 00:00:00  6 Month     247.35
2011-02-14 00:00:00  12 Month    333.25
2012-05-23 00:00:00  12 Month    317.77
2013-05-28 00:00:00  12 Month    328.16
2014-05-31 00:00:00  12 Month    360.02
2011-07-11 00:00:00  12 Month    335.00
...

我希望得到类似的东西:

Sub_Date             Sub_type    Quantity  Price  
2011-03-31 00:00:00  3 Month     2         125.00
                     4 Month     0         0.00     # Promo not available this month
                     6 Month     1         250.78       
                     12 Month    2         334.70
2011-04-01 00:00:00  3 Month     2         125.00
                     4 Month     2         145.00     
                     6 Month     0         250.78       
                     12 Month    0         334.70
2013-04-02 00:00:00  3 Month     1         125.00
                     4 Month     3         145.00    
                     6 Month     0         250.78       
                     12 Month    1         334.70
...
2015-06-23 00:00:00  3 Month     4         135.12
                     4 Month     0         0.00     # Promo not available this month
                     6 Month     0         272.71       
                     12 Month    3         354.12
...

我只能获得给定日期的Sub_Type总数。

df.Sub_Date.groupby([df.Sub_Date.values.astype('datetime64[D]')]).size()

这是一个好的开始,但不完全是需要的。我已经看过熊猫网站上的groupby文档,但我无法获得我想要的输出。

1 个答案:

答案 0 :(得分:1)

我认为您需要meansize aggregate,然后unstack stack添加缺失值。

如果需要更改级别Sub_Type的顺序,请使用ordered categorical

#generating all months ('1 Month','2 Month'...'12 Month')
cat = [str(x) + ' Month' for x in range(1,13)]
df.Sub_Type = df.Sub_Type.astype('category', categories=cat, ordered=True)

df1 = df.Price.groupby([df.Sub_Date.values.astype('datetime64[D]'), df.Sub_Type])
        .agg(['mean', 'size'])
        .rename(columns={'size':'Quantity','mean':'Price'})
        .unstack(fill_value=0)
        .stack()

print (df1)
                      Price  Quantity
           Sub_Type                  
2011-02-09 4 Month     0.00         0
           6 Month     0.00         0
           12 Month  333.25         1
2011-02-14 4 Month     0.00         0
           6 Month     0.00         0
           12 Month  333.25         1
2011-03-31 4 Month     0.00         0
           6 Month     0.00         0
           12 Month  331.00         1