Необходимо добавить новый столбец во фрейме данных Pandas на основе некоторого правила для определенного столбца. - PullRequest
2 голосов
/ 12 марта 2019

У меня есть фрейм данных в Pandas (с использованием Python 3.7), как показано ниже:

print("DATA FRAME DATA= \n",bin_data_df_sorted.head(5))
# OUTPUT:
# DATA FRAME DATA= 
#     actuals  probability
# 0      0.0     0.116375
# 1      0.0     0.239069
# 2      1.0     0.591988
# 3      0.0     0.273709
# 4      1.0     0.929855

Мне нужно добавить дополнительный столбец с именем 'bucket', такой что:

If probability value in between (0,0.1), then bucket=1
If probability value in between (0.1,0.2), then bucket=2
If probability value in between (0.2,0.3), then bucket=3
If probability value in between (0.3,0.4), then bucket=4
If probability value in between (0.4,0.5), then bucket=5
If probability value in between (0.5,0.6), then bucket=6
If probability value in between (0.6,0.7), then bucket=7
If probability value in between (0.7,0.8), then bucket=8
If probability value in between (0.8,0.9), then bucket=9
If probability value in between (0.9,1), then bucket=10

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

#     actuals  probability   bucket
# 0      0.0     0.116375      2
# 1      0.0     0.239069      3   
# 2      1.0     0.591988      6
# 3      0.0     0.273709      3
# 4      1.0     0.929855      10

Как мы можем это сделать?

ПРИМЕЧАНИЕ. Я пробовал приведенный ниже код, но он работает неправильно.

> for val in bin_data_df_sorted['probability']:
>     if val >= 0.0 and val <=0.1:
>         bin_data_df_sorted['bucket']=1
>     elif val > 0.1 and val <=0.2:
>         bin_data_df_sorted['bucket']=2
>     elif val > 0.2 and val <=0.3:
>         bin_data_df_sorted['bucket']=3
and so on.. 

1 Ответ

7 голосов
/ 12 марта 2019

Вы можете использовать pd.cut:

import numpy as np
bins = np.arange(0, 1.1, 0.1)
df['bucket'] = pd.cut(df.probability, bins, labels=(bins*10)[1:])

   actuals  probability bucket
0      0.0     0.116375    2.0
1      0.0     0.239069    3.0
2      1.0     0.591988    6.0
3      0.0     0.273709    3.0
4      1.0     0.929855   10.0

Подробности

pd.cut объединяет значения из последовательности в дискретные интервалы. Таким образом, вам нужно указать некоторые критерии для бин. Вы можете сделать:

bins = np.arange(0,1.1, 0.1)
# array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

И некоторые метки для возвращаемых корзин, которые в этом случае могут быть сгенерированы с использованием тех же bins:

(bins*10)[1:]
# array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...