Группировать данные в пандах по квантилям одного столбца - PullRequest
1 голос
/ 21 сентября 2019

Извините, если это повторяющийся пост - я не могу найти связанный пост, хотя

from random import seed
seed(100)
P = pd.DataFrame(np.random.randint(0, 100, size=(1000, 2)), columns=list('AB'))

Я хотел бы сгруппировать P по квартилям / квантилям / децилям / и т. Д. СтолбцаA, а затем рассчитать совокупную статистику (например, mean) по группам.Я могу определить децили столбца как

P['A'].quantile(np.arange(10) / 10)

. Я не уверен, как сгруппировать децили в A.Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

Если вы хотите сгруппировать P, например, по квартилям, запустите:

gr = P.groupby(pd.qcut(P.A, 4, labels=False))

Затем вы можете выполнить любые операции с этими группами.

Для презентации ниже у вас есть толькораспечатка P ограничена 20 строками:

for key, grp in gr:
    print(f'\nGroup: {key}\n{grp}')

, что дает:

Group: 0
     A   B
0    8  24
3   10  94
10   9  93
15   4  91
17   7  49

Group: 1
     A   B
7   34  24
8   15  60
12  27   4
13  31   1
14  13  83

Group: 2
     A   B
4   52  98
5   53  66
9   58  16
16  59  67
18  47  65

Group: 3
     A   B
1   67  87
2   79  48
6   98  14
11  86   2
19  61  14

Как видите, каждая группа (квартиль) имеет 5 членов, поэтому группировка правильная.

В качестве дополнения

Если вас интересуют границы каждого квартиля, запустите:

pd.qcut(P.A, 4, labels=False, retbins=True)[1]

Затем cut вернет 2 результата(кортеж).Первый элемент (номер 0) - это результат, возвращенный ранее, но на этот раз нас интересует элемент second (номер 1) - границы корзины.

Для ваших данных они:

array([ 4.  , 12.25, 40.5 , 59.5 , 98.  ])

Так, например, первый квартиль находится между 4 и 12,35 .

1 голос
/ 21 сентября 2019

Вы можете использовать серию quantile, чтобы создать еще один столбец, пометить каждую строку меткой квантиля, а затем сгруппировать по этому столбцу. numpy searchsorted очень полезно для этого:

import numpy as np
import pandas as pd
from random import seed

seed(100)
P = pd.DataFrame(np.random.randint(0, 100, size=(1000, 2)), columns=list('AB'))
q = P['A'].quantile(np.arange(10) / 10)
P['G'] = P['A'].apply(lambda x : q.index[np.searchsorted(q, x, side='right')-1])

Поскольку в серии квантилей хранятся нижние значения интервалов квантиля, обязательно передайте параметр side='right' в np.searchsortedчтобы не получить 0 (минимум должен быть 1, или у вас на один индекс больше, чем вам нужно).

Теперь вы можете разработать свою статистику, выполнив, например:

P.groupby('G').agg(['sum', 'mean']) #add to the list all the statistics method you wish
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...