我想在多个列表中创建一个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()
我需要一些有效的东西,因为在现实中我有数百万行......
谢谢!
答案 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