Python Pandas создает новую переменную Bin/Bucket с помощью pd.qcut
Как создать новую переменную Bin/Bucket, используя pd.qut в python?
Опытным пользователям это может показаться элементарным, но я не очень четко понял, и поиск по переполнению стека /google оказался на удивление не интуитивно понятным. Некоторый тщательный поиск дал это ( присвоение qcut как нового столбца), но он не совсем ответил на мой вопрос, потому что он не сделал последний шаг и не сложил все в мусорные ведра (то есть 1,2,...).
2 ответа
РЕДАКТИРОВАТЬ: приведенный ниже ответ действителен только для версий Pandas менее 0.15.0. Если вы работаете с Pandas 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]
Надеюсь, это поможет кому-то еще. По крайней мере, это должно быть легче искать сейчас.:)
В Пандах 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
устарела. использование codes
вместо:
data3['bins_spd'] = pd.qcut(data3['spd_pct'].values, 5).codes