在python/pandas中按月分组每日数据,同时首先按用户id分组

在python/pandas中按月分组每日数据,同时首先按用户id分组,python,pandas,Python,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/2

我的数据框中有下表:

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         
..
该表是使用以下查询从csv文件中提取的:

import pandas as pd

newnames = ['date','user_id', 'whole_cost', 'cost1']
df = pd.read_csv('expenses.csv', names = newnames, index_col = 'date')
我必须分析我的用户资料,为此:


我想按月对查询进行分组(对于每个用户,它们是数千个)整个月的查询
总成本
,例如,如果
user\u id=1
was在2012年10月2日的总成本为1790,成本为12,在2012年10月7日的总成本为364,那么它应该在新表中有一个条目2154(作为总成本)2012年10月31日(月末表示月份-转换表中的所有日期都将是月末,表示与之相关的整个月份)。

在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
在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

随着timegrouper被弃用,您可以将其替换为Grouper以获得相同的结果

df.groupby(['user_id', pd.Grouper(key='date', freq='M')]).agg({'whole_cost':sum})

df.groupby(['user_id', df['date'].dt.dayofweek]).agg({'whole_cost':sum})

嗯。我认为在0.14中不需要排序(很确定我已经解决了)。嗨,我有点困惑:你的变量'df'对应我的变量'frame'吗?如果是,那么df的类型是DataFrame,而不是DatetimeIndex(我之前因为这个原因有一个消息错误)。如何将“frame”转换为DatetimeIndex(我从.csv文件加载了数据)?@jeff可能我没有在这台机器上更新pandas。将进行检查(上面的示例与未排序的示例不同/不完整)-我认为文档中仍然提到它。@user3102882 df是一个数据帧。当我使用df1.groupby([pd.TimeGrouper(freq='M'),'user_id'])['whole_cost']时,sum()收到错误消息“Time grouper对象不可调用”