Используйте groupby
+ transform
, чтобы создать массив такой же формы, как ваш столбец values
, таким образом, вы можете просто разделить оба:
df['value2'] = df['value'] / df.groupby('groups')['value'].transform('sum')
Или
Мы можем использовать div
метод
df['value2'] = df['value'].div(df.groupby('groups')['value'].transform('sum'))
variable groups value value2
0 Both I 3099060 0.142272
1 Both U 175820 0.202002
2 C_only I 5207055 0.239046
3 C_only U 225992 0.259645
4 P_only I 4063438 0.186545
5 P_only U 175593 0.201741
6 None I 9413116 0.432138
7 None U 292982 0.336611
Сравнение скорости
dfbig = pd.concat([df]*100000)
dfbig.shape
(800000, 4)
Erfan 1
%%timeit
dfbig['value2'] = dfbig['value'] / dfbig.groupby('groups')['value'].transform('sum')
109 ms ± 8.92 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Erfan 2
%%timeit
dfbig['value2'] = dfbig['value'].div(dfbig.groupby('groups')['value'].transform('sum'))
113 ms ± 2.96 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
iamchoosinganame
%%timeit
dfbig['value2']=dfbig.groupby('groups')['value'].transform(lambda x: x/x.sum())
412 ms ± 12.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)