Использование бинов во фрейме данных Pandas - PullRequest
0 голосов
/ 26 октября 2018

Я работаю над фреймом данных, который имеет в общей сложности 4 столбца, я хочу, чтобы каждый столбец этого фрейма данных итеративно разбивался на 8 равных частей.Номер корзины должен быть присвоен данным в отдельном столбце для каждого столбца.Код должен работать, даже если любой другой фрейм данных имеет разные имена столбцов.Вот код, который я пробовал.

for c in df3.columns:
    df3['bucket_' + c] = (df3.max() - df3.min()) // 2 + 1
    buckets = pd.cut(df3['bucket_' + c], 8, labels=False) 

пример фрейма данных

ожидаемый вывод

Соответствующие столбцы binотобразить номер ячейки, назначенный каждой точке данных в соответствии с диапазоном, в который они попадут (используя pd.cut, чтобы разрезать столбец на 8 равных частей).Заранее спасибо !!

пример данных

gp1_min gp2 gp3 gp4

17.39   23.19   28.99   44.93

0.74    1.12    3.35    39.78

12.63   13.16   13.68   15.26

72.76   73.92   75.42   94.35

77.09   84.14   74.89   89.87

73.24   75.72   77.28   92.3

78.63   84.35   64.89   89.31

65.59   65.95   66.49   92.43

76.79   83.93   75.89   89.73

57.78   57.78   2.22    71.11

99.9    99.1    100      100

100     100    40.963855    100

ожидаемый результат

gp1_min gp2 gp3 gp4 bin_gp1 bin_gp2 bin_gp3 bin_gp4

17.39   23.19   28.99   44.93   2   2   2   3

0.74    1.12    3.35    39.78   1   1   1   3

12.63   13.16   13.68   15.26   1   2   2   2

72.76   73.92   75.42   94.35   5   6   6   7

77.09   84.14   74.89   89.87   6   7   6   7

73.24   75.72   77.28   92.3    6   6   6   7

78.63   84.35   64.89   89.31   6   7   5   7

65.59   65.95   66.49   92.43   5   6   5   7

76.79   83.93   75.89   89.73   6   7   6   7

57.78   57.78   2.22    71.11   4   4   1   6

99.9    99.1    100      100    8   8   8   8

100      100    40.96    100    8   8   3   8

1 Ответ

0 голосов
/ 26 октября 2018

Я бы использовал пару функций из numpy, а именно np.linspace, чтобы сделать границы бина, и np.digitize, чтобы поместить значения фрейма данных в бины:

import numpy as np
def binner(df,num_bins):
    for c in df.columns:
        cbins = np.linspace(min(df[c]),max(df[c]),num_bins+1)
        df[c + '_binned'] = np.digitize(df[c],cbins)
    return df
...