在python / pandas中按月对每日数据进行分组,而首先按用户ID进行分组

Spa*_*ace 4 python pandas

我在Pandas数据框中有下表:

date                 user_id  whole_cost  cost1             
02/10/2012 00:00:00        1       1790      12         
07/10/2012 00:00:00        1        364      15         
30/01/2013 00:00:00        1        280      10         
02/02/2013 00:00:00        1        259      24         
05/03/2013 00:00:00        1        201      39         
02/10/2012 00:00:00        3        623       1          
07/12/2012 00:00:00        3         90       0          
30/01/2013 00:00:00        3        312      90         
02/02/2013 00:00:00        5        359      45         
05/03/2013 00:00:00        5        301      34         
02/02/2013 00:00:00        5        359       1          
05/03/2013 00:00:00        5        801      12         
..
Run Code Online (Sandbox Code Playgroud)

该表是使用以下查询从csv文件中提取的:

import pandas as pd

newnames = ['date','user_id', 'whole_cost', 'cost1']
df = pd.read_csv('expenses.csv', names = newnames, index_col = 'date')
Run Code Online (Sandbox Code Playgroud)

为此,我必须分析用户的资料:

我想按月份将(每个用户-他们成千上万)查询分组,汇总whole_cost整个月的查询,例如,如果user_id=1在02/10/2012上的成本为1790,而在cost1 12上以及在07/10/2012上的总成本为总费用为364,则应在2012年10月31日(月末代表月的端点)的新表2154(作为总费用)中具有一个条目-转换后的表中的所有日期均为月代表与之相关的整个月结束)。

And*_*den 5

在0.14中,您可以同时按月分组和另一列分组:

In [11]: df
Out[11]:
            user_id  whole_cost  cost1
2012-10-02        1        1790     12
2012-10-07        1         364     15
2013-01-30        1         280     10
2013-02-02        1         259     24
2013-03-05        1         201     39
2012-10-02        3         623      1
2012-12-07        3          90      0
2013-01-30        3         312     90
2013-02-02        5         359     45
2013-03-05        5         301     34
2013-02-02        5         359      1
2013-03-05        5         801     12

In [12]: df1 = df.sort_index()  # requires sorted DatetimeIndex

In [13]: df1.groupby([pd.TimeGrouper(freq='M'), 'user_id'])['whole_cost'].sum()
Out[13]:
            user_id
2012-10-31  1          2154
            3           623
2012-12-31  3            90
2013-01-31  1           280
            3           312
2013-02-28  1           259
            5           718
2013-03-31  1           201
            5          1102
Name: whole_cost, dtype: int64
Run Code Online (Sandbox Code Playgroud)

直到0.14,我认为您仍然无法进行两次分组比:

In [14]: g = df.groupby('user_id')['whole_cost']

In [15]: g.resample('M', how='sum').dropna()
Out[15]:
user_id
1        2012-10-31    2154
         2013-01-31     280
         2013-02-28     259
         2013-03-31     201
3        2012-10-31     623
         2012-12-31      90
         2013-01-31     312
5        2013-02-28     718
         2013-03-31    1102
dtype: float64
Run Code Online (Sandbox Code Playgroud)