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

3
我有一个包含30万行数据的数据集,其中有以下DataFrame:
    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

客户ID值会批量重复。例如,第一行和第二行包含的客户ID值为17850的数据可能会在数据集的其他位置再次出现。 我正在尝试按相同的客户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提供帮助。谢谢。

那么让我尝试理解你的需求:您想编写识别客户ID变更并将连续变更之间的所有内容分组在一起的代码,是吗? - Mitchell Faas
可能是Pandas DataFrame:如何按连续值分组的重复问题。 - asongtoruin
@asongtoruin 我不这么认为。它们可能相似但并不相同。 - cs95
3个回答

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

2
我认为您可以将此代码作为另一种解决方案添加:df.groupby(['CustomerID',((df.CustomerID != df.CustomerID.shift()).cumsum())] - BENY
@ScottBoston 这似乎完美地运行并提供了所需的输出。非常感谢。 - Yasar Qamar

0
import pandas as pd

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

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

0

知道这有点晚了,而且我没有在你的示例上测试过,但我认为被接受的答案的可读性很低。这不仅易读,而且提供了以下功能:(1)持久化类DataFrame,(2)应用平均值、计数、求和等操作,以及(3)启用多列分组。

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

使用您的值...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接