在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对象不可调用”