2015-02-10 7 views
10

Как создать новую переменную Bin/Bucket с помощью pd.qut в python?Python Pandas Создает новую переменную Bin/Bucket с pd.qcut

Это может показаться элементарным для опытных пользователей, но я не был предельно ясен на этом, и было удивительно неинтуитивно для поиска в переполнении стека/google. Некоторый тщательный поиск дал это (Assignment of qcut as new column), но он не совсем ответил на мой вопрос, потому что он не сделал последнего шага и поместил все в бункеры (т. Е. 1,2, ...).

ответ

3

EDIT: Нижеприведенный ответ действителен только для версий Pandas менее 0,15.0. Если вы работаете панды 15 или выше, см:

data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False) 

Благодаря @unutbu для указания его. :)

Скажите, что у вас есть данные, которые вы хотите использовать, в моих вариантах распространения вариантов, и вы хотите создать новую переменную с ведрами, соответствующими каждому наблюдению. Ссылка Выше упоминалось, что вы можете сделать это:

print pd.qcut(data3['spd_pct'], 40) 

(0.087, 0.146] 
(0.0548, 0.087] 
(0.146, 0.5] 
(0.146, 0.5] 
(0.087, 0.146] 
(0.0548, 0.087] 
(0.5, 2] 

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

print pd.qcut(data3['spd_pct'],5).labels 

[2 1 3 ..., 0 1 4] 

Собирает все вместе, если вы хотели бы создать новую переменный с только цифрами бен, это должно быть достаточно:

data3['bins_spd']=pd.qcut(data3['spd_pct'],5).labels 

print data3.head() 

    secid  date symbol symbol_flag  exdate last_date cp_flag 0 5005 1/2/1997 099F2.37   0 1/18/1997   NaN  P 
1 5005 1/2/1997 09B0B.1B   0 2/22/1997 12/3/1996  P 
2 5005 1/2/1997 09B7C.2F   0 2/22/1997 12/11/1996  P 
3 5005 1/2/1997 09EE6.6E   0 1/18/1997 12/27/1996  C 
4 5005 1/2/1997 09F2F.CE   0 8/16/1997   NaN  P 

    strike_price best_bid best_offer  ...  close volume_y return 0   7500  2.875  3.2500  ...  4.5  99200 0.074627 
1   10000  5.375  5.7500  ...  4.5  99200 0.074627 
2   5000  0.625  0.8750  ...  4.5  99200 0.074627 
3   5000  0.125  0.1875  ...  4.5  99200 0.074627 
4   7500  3.000  3.3750  ...  4.5  99200 0.074627 

    cfadj_y open cfret shrout  mid spd_pct bins_spd 
0  1 4.5  1 57735 3.06250 0.122449   2 
1  1 4.5  1 57735 5.56250 0.067416   1 
2  1 4.5  1 57735 0.75000 0.333333   3 
3  1 4.5  1 57735 0.15625 0.400000   3 
4  1 4.5  1 57735 3.18750 0.117647   2 

[5 rows x 35 columns] 

Надеюсь, это поможет кому-то еще. По крайней мере, это должно быть проще искать сейчас. :)

7

В Pandas 0.15.0 или новее pd.qcut вернет серию, а не категорически, если вход представляет собой серию (как есть, в вашем случае) или labels=False. Если вы установили labels=False, то qcut вернет серию с целыми индикаторами бункеров в качестве значений.

Так будущее доказательство вашего кода, вы можете использовать

data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False) 

или передать массив NumPy в pd.qcut, так что вы получите Категорический в качестве возвращаемого значения. Обратите внимание, что категориальный атрибут labels is deprecated. Использовать codes вместо:

data3['bins_spd'] = pd.qcut(data3['spd_pct'].values, 5).codes 
+0

Отлично! Я не знал об этом. Спасибо, что указали. – sfortney

 Смежные вопросы

  • Нет связанных вопросов^_^