从DataFrameGroupBy对象

时间:2017-07-26 15:16:19

标签: python list dataframe group-by

我想在多个列表中创建一个groupby数据帧和组行: 我有以下数据框:

list_date    = [1,1,2,2,2,3,3,3,4,5]
list_request = [2,2,2,3,3,2,3,3,3,3]
list_users   = [1,3,7,1,7,3,4,9,7,9]
list_count   = [1,1,2,3,1,3,1,2,1,1]
df = pd.DataFrame({'date':list_date,'request':list_request,'users':list_users, 'count':list_count})

count  date  request  users
0      1     1        2      1
1      1     1        2      3
2      2     2        2      7
3      3     2        3      1
4      1     2        3      7
5      3     3        2      3
6      1     3        3      4
7      2     3        3      9
8      1     4        3      7
9      1     5        3      9

我希望得到以下结果(按[' date',' request']分组):

count       date  request   users
0  [1, 1]     1        2  [1, 3]
1     [2]     2        2     [7]
2  [3, 1]     2        3  [1, 7]
3     [3]     3        2     [3]
4  [1, 2]     3        3  [4, 9]
5     [1]     4        3     [7]
6     [1]     5        3     [9]

如果我在这里使用解决方案:grouping rows in list in pandas groupby 我可以创建1个列表但是如何同时创建2个列表? 类似的东西:

df = df.groupby(['date','request'])['users','count'].apply(list).reset_index()

我需要一些有效的东西,因为在现实中我有数百万行......

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以应用pd.Series,然后重命名列:

In [299]: df.groupby(['date', 'request']).apply(lambda x: pd.Series((x['count'].tolist(), x['users'].tolist()))).reset_index().rename(columns={0 : 'count', 1 : 'users'})
Out[299]: 
   date  request   count   users
0     1        2  [1, 1]  [1, 3]
1     2        2     [2]     [7]
2     2        3  [3, 1]  [1, 7]
3     3        2     [3]     [3]
4     3        3  [1, 2]  [4, 9]
5     4        3     [1]     [7]
6     5        3     [1]     [9]

另一种解决方案是使用df.apply

应用列表
In [364]: grouped_df = df.groupby(['date', 'request'])

In [365]: pd.DataFrame({ 'count' : grouped_df['count'].apply(list), 'users' : grouped_df['users'].apply(list) }).reset_index() #, columns=['count', 'users'])
Out[365]: 
   date  request   count   users
0     1        2  [1, 1]  [1, 3]
1     2        2     [2]     [7]
2     2        3  [3, 1]  [1, 7]
3     3        2     [3]     [3]
4     3        3  [1, 2]  [4, 9]
5     4        3     [1]     [7]
6     5        3     [1]     [9]

这里可以看到更好的解决方案(我问了一个问题):Converting each grouped column in DataFrameGroupBy object to a list