Python 2.7 - Рассчитать квантили на строку - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть серия панд, подобная этой:

0       1787
1       4789
2       1350
3       1476
4          0
5        747
6        307
7        147
8        221
9        -88
10      9374
11       264
12      1109
13       502
14       360
15       194
16      4073
17      2317
18      -221
20         0
21        16
22       106
29       105
30      4189
31       171
32        42

Я хочу создать 4 переменные с горячим кодированием, которые указывают, какое значение в строке находится на каком квартиле, разделяя ряд на 4 квартиля.Это будет что-то вроде этого:

0       1787   Q1   Q2  Q3  Q4
1       4789   0    0   0   0
2       1350   0    0   0   1
3       1476   1    0   0   0
4          0   0    1   0   0 
5        747   0    0   1   0
6        307   1    0   1   0
7        147   0    1   0   1

Я знаю, что числа не совсем совпадают, это просто для наглядного примера желаемого результата.

Я пробовал это:

series.quantile[0.25, 0.5, 0.75, 1]

Но это только выкрикивает эти четыре значения:

0.25         67
0.50      442.5
0.75    1477.75
1.00      71188

Я также пробовал это:

series.apply(lambda x : series.quantile(x, 'lower'))

Однако это приводит к следующей ошибке:

ValueError: percentiles should all be in the interval [0, 1]. Try 17.87 instead.

Как лучше всего достичь моей цели ??

Заранее большое спасибо

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Следующий код, показывающий pandas.qcut и pandas.get_dummies должен выполнить

quantiles = pd.qcut(series,
                    [0, 0.25, 0.5, 0.75, 1],
                    labels=['Q1', 'Q2', 'Q3', 'Q4'])
dummies = pd.get_dummies(quantiles)
pd.concat([df, dummies], axis=1)

преобразование в

    Series  Q1  Q2  Q3  Q4
0     1787   0   0   0   1
1     4789   0   0   0   1
2     1350   0   0   1   0
3     1476   0   0   0   1
4        0   1   0   0   0
5      747   0   0   1   0
6      307   0   0   1   0
7      147   0   1   0   0
8      221   0   1   0   0
9      -88   1   0   0   0
10    9374   0   0   0   1
11     264   0   1   0   0
12    1109   0   0   1   0
13     502   0   0   1   0
14     360   0   0   1   0
15     194   0   1   0   0
16    4073   0   0   0   1
17    2317   0   0   0   1
18    -221   1   0   0   0
20       0   1   0   0   0
21      16   1   0   0   0
22     106   0   1   0   0
29     105   1   0   0   0
30    4189   0   0   0   1
31     171   0   1   0   0
32      42   1   0   0   0
0 голосов
/ 09 декабря 2018

Я думаю, вы можете попробовать это.

  1. Создайте кадр данных с серией


df = pd.DataFrame({'Series': series})


Создание второго df с данными квантилей (включая 0)


quantiles = df['Series'].quantile([0, 0.25, 0.5, 0.75, 1]).to_frame('quantiles').reset_index(drop = True)


Создайте столбцы Q с этим циклом for.


for quant, Q in enumerate(['Q1', 'Q2', 'Q3', 'Q4']):
    quant = quant + 1
    df.loc[:,Q] = np.where((df.Series > quantiles.quantiles[quant-1]) & (df.Series <= quantiles.quantiles[quant]), 1, 0)


, которые должны дать вам это:

Series  Q1  Q2  Q3  Q4
0   1787    0   0   0   1
1   4789    0   0   0   1
2   1350    0   0   1   0
3   1476    0   0   0   1
4   0   1   0   0   0
5   747 0   0   1   0
6   307 0   0   1   0
7   147 0   1   0   0
8   221 0   1   0   0
9   -88 1   0   0   0
10  9374    0   0   0   1
11  264 0   1   0   0
12  1109    0   0   1   0
13  502 0   0   1   0
14  360 0   0   1   0
15  194 0   1   0   0
16  4073    0   0   0   1
17  2317    0   0   0   1
18  -221    0   0   0   0
19  0   1   0   0   0
20  16  1   0   0   0
21  106 0   1   0   0
22  105 1   0   0   0
23  4189    0   0   0   1
24  171 0   1   0   0
25  42  1   0   0   0
...