有没有办法知道groupby中group中一行的部分?
Is there a way to know the portion of a row in group in groupby?
我正在研究这个 table:
plaza
station
name
ID
g1
g2
g3
location
g_avg
45
1
aaa
45_1_aaa
4
5
6
sun
5.00
45
2
aaa
45_2_aaa
1
5
2
sun
2.67
46
1
bbb
46_1_bbb
8
9
3
sun
6.67
47
1
ccc
47_1_ccc
4
5
0
sun
3.00
47
2
ccc
47_2_ccc
3
4
7
sun
4.67
45
3
aaa
45_3_aaa
3
4
0
sun
2.33
34
1
ddd
34_1_ddd
19
29
28
moon
25.33
47
3
eee
47_3_eee
1
2
2
moon
1.67
48
1
fff
48_1_fff
1
2
1
moon
1.33
49
1
ggg
49_1_ggg
2
1
1
moon
1.33
49
2
ggg
49_2_ggg
1
1
1
moon
1.00
我是 运行 位置和 ID 列上的 groupby,我想为每一行获取 g_avg 除以该行的 g_average 之和位置。
我使用的代码是这个
data.groupby(['location', 'ID']).apply(lambda x: len(x['g_avg']) /x['g_avg'].sum() * 100)
这是我得到的结果:
我希望实现的是:
我哪里错了?
您可以使用 groupby.transform
来计算每个位置的总数 g_avg
;然后将 g_avg
个值除以这些总和:
df['ratio'] = df['g_avg'] / df.groupby('location')['g_avg'].transform('sum') * 100
out = df[['location','ID','ratio']]
输出:
location ID ratio
0 sun 45_1_aaa 20.542317
1 sun 45_2_aaa 10.969597
2 sun 46_1_bbb 27.403451
3 sun 47_1_ccc 12.325390
4 sun 47_2_ccc 19.186524
5 sun 45_3_aaa 9.572720
6 moon 34_1_ddd 82.615786
7 moon 47_3_eee 5.446836
8 moon 48_1_fff 4.337900
9 moon 49_1_ggg 4.337900
10 moon 49_2_ggg 3.261579
我正在研究这个 table:
plaza | station | name | ID | g1 | g2 | g3 | location | g_avg |
---|---|---|---|---|---|---|---|---|
45 | 1 | aaa | 45_1_aaa | 4 | 5 | 6 | sun | 5.00 |
45 | 2 | aaa | 45_2_aaa | 1 | 5 | 2 | sun | 2.67 |
46 | 1 | bbb | 46_1_bbb | 8 | 9 | 3 | sun | 6.67 |
47 | 1 | ccc | 47_1_ccc | 4 | 5 | 0 | sun | 3.00 |
47 | 2 | ccc | 47_2_ccc | 3 | 4 | 7 | sun | 4.67 |
45 | 3 | aaa | 45_3_aaa | 3 | 4 | 0 | sun | 2.33 |
34 | 1 | ddd | 34_1_ddd | 19 | 29 | 28 | moon | 25.33 |
47 | 3 | eee | 47_3_eee | 1 | 2 | 2 | moon | 1.67 |
48 | 1 | fff | 48_1_fff | 1 | 2 | 1 | moon | 1.33 |
49 | 1 | ggg | 49_1_ggg | 2 | 1 | 1 | moon | 1.33 |
49 | 2 | ggg | 49_2_ggg | 1 | 1 | 1 | moon | 1.00 |
我是 运行 位置和 ID 列上的 groupby,我想为每一行获取 g_avg 除以该行的 g_average 之和位置。
我使用的代码是这个
data.groupby(['location', 'ID']).apply(lambda x: len(x['g_avg']) /x['g_avg'].sum() * 100)
这是我得到的结果:
我希望实现的是:
我哪里错了?
您可以使用 groupby.transform
来计算每个位置的总数 g_avg
;然后将 g_avg
个值除以这些总和:
df['ratio'] = df['g_avg'] / df.groupby('location')['g_avg'].transform('sum') * 100
out = df[['location','ID','ratio']]
输出:
location ID ratio
0 sun 45_1_aaa 20.542317
1 sun 45_2_aaa 10.969597
2 sun 46_1_bbb 27.403451
3 sun 47_1_ccc 12.325390
4 sun 47_2_ccc 19.186524
5 sun 45_3_aaa 9.572720
6 moon 34_1_ddd 82.615786
7 moon 47_3_eee 5.446836
8 moon 48_1_fff 4.337900
9 moon 49_1_ggg 4.337900
10 moon 49_2_ggg 3.261579