Получить 25 квантилей в cumsum pandas

#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