将数据框中的列转换为“类”?

3

所以我基本上有这个数据框:

,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个回答

3
使用pandas.cut,您可以为“bins”和“labels”定义可迭代对象。这个过程可以通过使用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

1
我认为整数除法 // 可以实现这一点:
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

我唯一担心的是这个解决方案(可能也影响我的)会出现浮点数舍入问题,例如如果将6.0存储为6.00001,那么这是否正确?也许我们需要先转换为int,使用np.isclose来确保我们得到正确的结果。 - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接