Преобразовать столбец в dataframe в «классы»? - PullRequest
0 голосов
/ 02 июня 2018

Итак, по сути, у меня есть этот фрейм данных:

,club_name,tr_begin,year,ranking
0,ADO Den Haag,1357,2010,6.0
1,ADO Den Haag,1480,2011,15.0
2,ADO Den Haag,1397,2012,9.0
3,ADO Den Haag,1384,2013,9.0
4,ADO Den Haag,1451,2014,13.0

Что я хочу сделать, так это то, что я хочу пройтись по каждому ранжированию и поместить их в класс на основе его значения.Таким образом, ранжирование 6 перейдет в класс № 2, а ранжирование 1 перейдет в класс № 1. Таблица конверсии такова:

if ranking > 0 and ranking =< 3:
    rank_class = 1
if ranking > 3 and ranking =< 6:
    rank_class = 2 

etc etc etc

Я бы хотел, чтобы это было кратно 3 до 18.

Итак, я надеюсь, что результат будет:

,club_name,tr_begin,year,ranking, ranking_class
0,ADO Den Haag,1357,2010,6.0, 2
1,ADO Den Haag,1480,2011,15.0, 5
2,ADO Den Haag,1397,2012,9.0, 3
3,ADO Den Haag,1384,2013,9.0, 3
4,ADO Den Haag,1451,2014,13.0, 5

Я попытался с помощью функции маски, и создав новый фрейм данных и затем объединившись, это сработало, но просто показалось очень неаккуратным.Есть ли какой-нибудь простой способ сделать это?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Я думаю, что целочисленное деление // сделает это:

df.assign(ranking_class=(df.ranking // 3).astype(int))

      club_name  tr_begin  year  ranking  ranking_class
0  ADO Den Haag      1357  2010      6.0              2
1  ADO Den Haag      1480  2011     15.0              5
2  ADO Den Haag      1397  2012      9.0              3
3  ADO Den Haag      1384  2013      9.0              3
4  ADO Den Haag      1451  2014     13.0              4
0 голосов
/ 02 июня 2018

Используя pandas.cut, вы можете определить итерации для ваших "корзин" и "меток".Это упрощается тем фактом, что оба они могут быть определены с использованием range объектов.

Я рекомендую сначала преобразовать серию ranking в int; округление с плавающей точкой может привести к нежелательным результатам.

df = pd.read_csv('file.csv')

binrange = range(0, 19, 3)
labrange = range(1, 7)

df['ranking_class'] = pd.cut(df['ranking'], bins=binrange, labels=labrange)

print(df)

      club_name  tr_begin  year  ranking ranking_class
0  ADO Den Haag      1357  2010      6.0             2
1  ADO Den Haag      1480  2011     15.0             5
2  ADO Den Haag      1397  2012      9.0             3
3  ADO Den Haag      1384  2013      9.0             3
4  ADO Den Haag      1451  2014     13.0             5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...