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

时间:2018-06-02 13:05:55

标签: python python-3.x pandas dataframe

所以我基本上得到了这个数据帧:

,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 :(得分:2)

使用pandas.cut,您可以为“bins”和“labels”定义iterables。这可以通过使用range对象来定义它们来简化。

我建议您先将ranking系列转换为int;它可能会受到floating-point rounding的影响,这可能会产生不良后果。

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 :(得分:1)

我认为整数除法Gol. Darah会这样做:

//