Pandas 如何在特定条件下正确分组
Pandas how to do group by properly over certain conditions
我在 pandas 中尝试分组时遇到问题,我的数据是 table 直到“总和”系列,我想要的输出是某种分组依据,可以给我结果这些系列:desired_clientgroup 和 DesiredGroup_out_sum/avg/max。
例如数字“104,23”是客户组 1 的总和(我不知道如何生成这个组 1 甚至它的总和)。
df_index
client_items
price
qty
sum
desired_clientgroup
DesiredGroup_output_sum
1
1
10,9
2
21,8
1
104,23
2
2
8,5
5
42,5
1
3
3
5,75
3
17,25
1
4
4
2,88
1
2,88
1
5
5
9,9
2
19,8
1
6
1
2,2
4
8,8
2
32,92
7
2
3,55
3
10,65
2
8
3
4,49
3
13,47
2
9
1
8,2
2
16,4
3
44,79
10
2
9,19
2
18,38
3
11
3
6,67
1
6,67
3
12
4
3,34
1
3,34
3
13
1
15,99
3
47,97
4
162,65
14
2
19,9
5
99,5
4
15
3
7,59
2
15,18
4
有什么想法吗?
IIUC,你可以使用:
# start groups on 1
mask = df['client_items'].eq(1)
df['clientgroup'] = mask.cumsum()
# get the sum per group
# assign result only on first group row
df.loc[mask, 'output_sum'] = (df.groupby('clientgroup')
['sum'].transform('sum')
)
输出:
df_index client_items price qty sum clientgroup output_sum
0 1 1 10.90 2 21.80 1 104.23
1 2 2 8.50 5 42.50 1 NaN
2 3 3 5.75 3 17.25 1 NaN
3 4 4 2.88 1 2.88 1 NaN
4 5 5 9.90 2 19.80 1 NaN
5 6 1 2.20 4 8.80 2 32.92
6 7 2 3.55 3 10.65 2 NaN
7 8 3 4.49 3 13.47 2 NaN
8 9 1 8.20 2 16.40 3 44.79
9 10 2 9.19 2 18.38 3 NaN
10 11 3 6.67 1 6.67 3 NaN
11 12 4 3.34 1 3.34 3 NaN
12 13 1 15.99 3 47.97 4 162.65
13 14 2 19.90 5 99.50 4 NaN
14 15 3 7.59 2 15.18 4 NaN
我在 pandas 中尝试分组时遇到问题,我的数据是 table 直到“总和”系列,我想要的输出是某种分组依据,可以给我结果这些系列:desired_clientgroup 和 DesiredGroup_out_sum/avg/max。 例如数字“104,23”是客户组 1 的总和(我不知道如何生成这个组 1 甚至它的总和)。
df_index | client_items | price | qty | sum | desired_clientgroup | DesiredGroup_output_sum |
---|---|---|---|---|---|---|
1 | 1 | 10,9 | 2 | 21,8 | 1 | 104,23 |
2 | 2 | 8,5 | 5 | 42,5 | 1 | |
3 | 3 | 5,75 | 3 | 17,25 | 1 | |
4 | 4 | 2,88 | 1 | 2,88 | 1 | |
5 | 5 | 9,9 | 2 | 19,8 | 1 | |
6 | 1 | 2,2 | 4 | 8,8 | 2 | 32,92 |
7 | 2 | 3,55 | 3 | 10,65 | 2 | |
8 | 3 | 4,49 | 3 | 13,47 | 2 | |
9 | 1 | 8,2 | 2 | 16,4 | 3 | 44,79 |
10 | 2 | 9,19 | 2 | 18,38 | 3 | |
11 | 3 | 6,67 | 1 | 6,67 | 3 | |
12 | 4 | 3,34 | 1 | 3,34 | 3 | |
13 | 1 | 15,99 | 3 | 47,97 | 4 | 162,65 |
14 | 2 | 19,9 | 5 | 99,5 | 4 | |
15 | 3 | 7,59 | 2 | 15,18 | 4 |
有什么想法吗?
IIUC,你可以使用:
# start groups on 1
mask = df['client_items'].eq(1)
df['clientgroup'] = mask.cumsum()
# get the sum per group
# assign result only on first group row
df.loc[mask, 'output_sum'] = (df.groupby('clientgroup')
['sum'].transform('sum')
)
输出:
df_index client_items price qty sum clientgroup output_sum
0 1 1 10.90 2 21.80 1 104.23
1 2 2 8.50 5 42.50 1 NaN
2 3 3 5.75 3 17.25 1 NaN
3 4 4 2.88 1 2.88 1 NaN
4 5 5 9.90 2 19.80 1 NaN
5 6 1 2.20 4 8.80 2 32.92
6 7 2 3.55 3 10.65 2 NaN
7 8 3 4.49 3 13.47 2 NaN
8 9 1 8.20 2 16.40 3 44.79
9 10 2 9.19 2 18.38 3 NaN
10 11 3 6.67 1 6.67 3 NaN
11 12 4 3.34 1 3.34 3 NaN
12 13 1 15.99 3 47.97 4 162.65
13 14 2 19.90 5 99.50 4 NaN
14 15 3 7.59 2 15.18 4 NaN