#python #pandas
#python #pandas
Вопрос:
Предположим, у меня есть следующий фрейм данных:
df = pd.DataFrame({'id': [2, 4, 10, 12, 13, 14, 19, 20, 21, 22, 24, 25, 27, 29, 30, 31, 42, 50, 54],
'value': [37410.0, 18400.0, 200000.0, 392000.0, 108000.0, 423000.0, 80000.0, 307950.0,
50807.0, 201740.0, 182700.0, 131300.0, 282005.0, 428800.0, 56000.0, 412400.0, 1091595.0, 1237200.0,
927500.0]})
И я делаю следующее:
df.sort_values(by='id').set_index('id').cumsum()
value
id
2 37410.0
4 55810.0
10 255810.0
12 647810.0
13 755810.0
14 1178810.0
19 1258810.0
20 1566760.0
21 1617567.0
22 1819307.0
24 2002007.0
25 2133307.0
27 2415312.0
29 2844112.0
30 2900112.0
31 3312512.0
42 4404107.0
50 5641307.0
54 6568807.0
Я хочу знать первый элемент id, который превышает 25% от совокупной суммы. В этом примере 25% от cumsum будет составлять 1 642 201,75. Первый элемент, который превысит это значение, будет равен 22. Я знаю, что это можно сделать с помощью for , но я думаю, что это было бы довольно неэффективно.
Ответ №1:
Вы могли бы сделать:
percentile_25 = df['value'].sum() * 0.25
res = df[df['value'].cumsum() > percentile_25].head(1)
print(res)
Вывод
id value
9 22 201740.0
Или используйте searchsorted для выполнения поиска в O (log N):
percentile_25 = df['value'].sum() * 0.25
i = df['value'].cumsum().searchsorted(percentile_25)
res = df.iloc[i]
print(res)
Вывод
id 22.0
value 201740.0
Name: 9, dtype: float64