Биннинг в кадре данных Python Pandas (не устанавливает бины вручную) - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть фрейм данных.Я хочу, чтобы значения бина и добавить его в новый столбец.Я могу сделать это с помощью pd.cut.Но дело в том, что с помощью pd.cut я устанавливаю метки и корзины вручную.Но я хочу просто установить размер шага (не номер корзины).я пробовал также np.linespace, np.arange, но там я должен указать начальную и конечную точку, а также количество бинов.но может быть датафрейм, который я не смог бы узнать максимальное и минимальное число в фрейме данных

df = pd.DataFrame([10, 10, 23, 42, 51, 33, 52, 42,44, 67, 65, 12, 10, 2, 3, 2, 77, 76],columns=['values'])
bins = [0, 10, 20,30, 40, 50, 60, 70]
labels = ['0-10', '10-20', '20-30', '30-40', '40-50', '50-60', '60-70']
df['bins'] = pd.cut(df['values'], bins, labels=labels)
print (df)

    values   bins
0       10   0-10
1       10   0-10
2       23  20-30
3       42  40-50
4       51  50-60
5       33  30-40
6       52  50-60
7       42  40-50
8       44  40-50
9       67  60-70
10      65  60-70
11      12  10-20
12      10   0-10
13       2   0-10
14       3   0-10
15       2   0-10
16      77    NaN
17      76    NaN

Вот мой вывод, я хочу получить тот же вывод, но не с ручной настройкой бинов и меток psКак вы видите, если у меня есть значения больше 70, это будет Нэн.Так что это также причина, почему я хочу просто установить размер шага "10".У меня могут быть значения продолжения, поэтому я хочу, чтобы они были помечены автоматически с помощью шагов размером 10

Я бы действительно оценил вашу помощь

Спасибо !!!

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

@ Вайшали в основном ответил на вопрос, но просто добавлю, что для того, чтобы программно получить нужные метки, вы можете использовать значения bin в понимании списка, в результате чего приведенные ниже строковые метки (соответствуют вашему желаемому фрейму)

df = pd.DataFrame([10, 10, 23, 42, 51, 33, 52, 42,44, 67, 65, 12, 10, 2, 3, 2, 77, 76],columns=['values'])
bins = np.arange(0,df['values'].max() + 10, 10)
labels = ['-'.join(map(str,(x,y))) for x, y in zip(bins[:-1], bins[1:])]

df['bins'] = pd.cut(df['values'], bins = bins, labels=labels)

>>> df
    values   bins
0       10   0-10
1       10   0-10
2       23  20-30
3       42  40-50
4       51  50-60
5       33  30-40
6       52  50-60
7       42  40-50
8       44  40-50
9       67  60-70
10      65  60-70
11      12  10-20
12      10   0-10
13       2   0-10
14       3   0-10
15       2   0-10
16      77  70-80
17      76  70-80
0 голосов
/ 24 июня 2019

Здесь мы решаем эту проблему, просто используя функцию Binning и битовую справку функции numpy.

df = pd.DataFrame([10, 10, 23, 42, 51, 33, 52, 42,44, 67, 65, 12, 10, 2, 3, 2,  77, 76],columns=['values'])
max = df['value'].max()
df['Bins'] = pd.cut(df['value'], np.arange(0, max + 10, 10))
print(df)
0 голосов
/ 14 ноября 2018

Просто небольшое изменение в вашем коде, обратите внимание, что я добавил строку со значением 93 в конце вашего df.

df = pd.DataFrame([10, 10, 23, 42, 51, 33, 52, 42,44, 67, 65, 12, 10, 2, 3, 2, 77, 76, 93],columns=['values'])
bins = np.arange(0,df['values'].max() + 10, 10)
df['bins'] = pd.cut(df['values'], bins)

values  bins
0   10  (0, 10]
1   10  (0, 10]
2   23  (20, 30]
3   42  (40, 50]
4   51  (50, 60]
5   33  (30, 40]
6   52  (50, 60]
7   42  (40, 50]
8   44  (40, 50]
9   67  (60, 70]
10  65  (60, 70]
11  12  (10, 20]
12  10  (0, 10]
13  2   (0, 10]
14  3   (0, 10]
15  2   (0, 10]
16  77  (70, 80]
17  76  (70, 80]
18  93  (90, 100]

Редактировать: чтобы включить нули в ячейки, как указано в комментариях, установите для параметра include_lowest значение True

df = pd.DataFrame([0, 0, 0, 10, 10, 23, 42, 51, 33, 52, 42,44, 67, 65, 12, 10, 2, 3, 2, 77, 76, 93],columns=['values'])
bins = np.arange(0,df['values'].max() + 10, 10)
df['bins'] = pd.cut(df['values'], bins, include_lowest=True)

Вы получаете

   values   bins
0   0   (-0.001, 10.0]
1   0   (-0.001, 10.0]
2   0   (-0.001, 10.0]
3   10  (-0.001, 10.0]
4   10  (-0.001, 10.0]
5   23  (20.0, 30.0]
6   42  (40.0, 50.0]
7   51  (50.0, 60.0]
8   33  (30.0, 40.0]
9   52  (50.0, 60.0]
10  42  (40.0, 50.0]
11  44  (40.0, 50.0]
12  67  (60.0, 70.0]
13  65  (60.0, 70.0]
14  12  (10.0, 20.0]
15  10  (-0.001, 10.0]
16  2   (-0.001, 10.0]
17  3   (-0.001, 10.0]
18  2   (-0.001, 10.0]
19  77  (70.0, 80.0]
20  76  (70.0, 80.0]
21  93  (90.0, 100.0]
...