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

时间:2014-03-31 21:33:55

标签: 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         
..

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

import pandas as pd

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

我必须分析用户的个人资料并为此目的:

我想按月对每个查询whole_cost进行汇总(对于每个用户 - 它们是数千个)查询,例如:如果user_id=1在2012年2月2日的成本为1290且成本为12,而在2012年10月7日的成本为364,那么它应该在2154的新表格中有一个条目(作为整个成本)在2012年10月31日(月末结束时代表月份 - 转换表中的所有日期将是月末,代表它们所涉及的整个月)。

2 个答案:

答案 0 :(得分: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

直到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

答案 1 :(得分:1)

不建议使用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})