使用 Pandas 在 Python 中对数据帧的行子集进行分组
Grouping row subsets of a dataframe in Python using Pandas
我从包含 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 值成批重复。例如,前两行中包含的 CustomerID 值 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 值组合在一起,而不仅仅是前 2 行的一堆,然后是其他 CustomerID 值的后续串。
非常感谢您提供有关如何使用 Pandas 执行此操作的帮助。谢谢
import pandas as pd
# df <- I am assuming that df contais you data
result = df.groupby('CustomerID').sum().rename(columns={'Revenue': 'TotalRevenue'})
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) 保留 class DataFrame,(2) 应用平均值、计数、求和以及 (3) 在多个列上启用 groupby。
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
使用您的价值观...
df.groupby(['User ID']).agg({'Revenue': "sum"})
我从包含 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 值成批重复。例如,前两行中包含的 CustomerID 值 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 值组合在一起,而不仅仅是前 2 行的一堆,然后是其他 CustomerID 值的后续串。
非常感谢您提供有关如何使用 Pandas 执行此操作的帮助。谢谢
import pandas as pd
# df <- I am assuming that df contais you data
result = df.groupby('CustomerID').sum().rename(columns={'Revenue': 'TotalRevenue'})
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) 保留 class DataFrame,(2) 应用平均值、计数、求和以及 (3) 在多个列上启用 groupby。
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
使用您的价值观...
df.groupby(['User ID']).agg({'Revenue': "sum"})