使用Pandas在Python中对数据帧的行子集进行分组

时间:2017-07-24 16:11:20

标签: python python-3.x pandas pandas-groupby

我从包含30万行的数据集中得到以下数据框:

    CustomerID  Revenue
0   17850.0     15.30
1   17850.0     11.10
2   13047.0     17.85
3   13047.0     17.85
4   17850.0     20.34
5   13047.0     12.60
6   13047.0     12.60
7   13047.0     31.80
8   17850.0     20.34
9   17850.0     15.30
10  13047.0     9.90
11  13047.0     30.00
12  13047.0     31.80
13  12583.0     40.80
14  12583.0     39.60
15  13047.0     14.85
16  13047.0     14.85
17  12583.0     15.60
18  12583.0     45.00
19  12583.0     70.80

CustomerID值分批重复。例如,前两行中包含的17850的CustomerID值可能稍后在datset中的某个点再次出现。 我试图通过相同的客户ID对行的子集进行分组,并总结该组的收入。我想要做的数据帧转换应如下所示:

   CustomerID   TotalRevenue
0   17850.0      26.40
1   13047.0      35.70
2   17850.0      20.34
3   13047.0      57.0
4   17850.0      35.64
5   13047.0      71.7
6   12583.0      80.4
7   13047.0      29.7
8   12583.0     131.4

问题是如果我使用groupby方法,它会将具有相同CustomerID值的所有行分组。因此,它将整个数据框中的所有17850 CustomerID值组合在一起,而不仅仅是前两行的一堆,然后是后续的其他CustomerID值。

非常感谢使用Pandas如何做到这一点。谢谢

3 个答案:

答案 0 :(得分:3)

df.groupby(['CustomerID',df.CustomerID.diff().ne(0).cumsum()],sort=False)['Revenue'].sum().rename_axis(['CustomerID','GID']).reset_index().drop('GID',axis=1)

输出:

   CustomerID  Revenue
0     17850.0    26.40
1     13047.0    35.70
2     17850.0    20.34
3     13047.0    57.00
4     17850.0    35.64
5     13047.0    71.70
6     12583.0    80.40
7     13047.0    29.70
8     12583.0   131.40

答案 1 :(得分:0)

import pandas as pd

# df <- I am assuming that df contais you data

result = df.groupby('CustomerID').sum().rename(columns={'Revenue': 'TotalRevenue'})

答案 2 :(得分:0)

知道这已经很晚了,我还没有在您的示例中对此进行测试,但是我认为公认答案的可读性很低。这不仅清晰易懂,而且还提供了以下能力:(1)持久化DataFrame类,(2)应用平均值,计数,求和,以及(3)在多个列上启用groupby。

df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})

使用您的值...

df.groupby(['User ID']).agg({'Revenue': "sum"})