将有序级别转换为pandas中的数字

时间:2017-03-01 11:32:58

标签: pandas

我想知道熊猫中是否有任何功能允许我这样做。

我有一个级别为[低,中,高]的列。

我想将它们翻译成[1,2,3]来执行线性回归。但是,我目前正在做的是df[df['interest_level'] == 'low'] = 1。有更好的方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

使用pd.factorize()方法:

df['interest_level'] = pd.factorize(df['interest_level'])[0]

您还可以对新数值进行分类(这可能会节省大量内存):

示例DataFrame:

In [34]: df = pd.DataFrame({'interest_level':np.random.choice(['medium','high','low'], 10)})

In [35]: df
Out[35]:
  interest_level
0           high
1            low
2         medium
3           high
4            low
5           high
6           high
7            low
8            low
9         medium

解决方案:

In [36]: df['interest_level'], cats = pd.factorize(df['interest_level'])

In [37]: df['interest_level'] = pd.Categorical(df['interest_level'], categories=np.arange(len(cats)))

In [38]: df
Out[38]:
  interest_level
0              0
1              1
2              2
3              0
4              1
5              0
6              0
7              1
8              1
9              2

In [39]: cats      # this can be used for the backtracing ...
Out[39]: Index(['high', 'low', 'medium'], dtype='object')

In [40]: df.memory_usage()
Out[40]:
Index             80
interest_level    34   # <---- NOTE: only 34 bytes used for 10 integers
dtype: int64

In [41]: df.dtypes
Out[41]:
interest_level    category
dtype: object

答案 1 :(得分:1)

您可以使用map

d = {'low':1,'medium':2,'high':3}

df['interest_level'] = df['interest_level'].map(d)

样品:

df = pd.DataFrame({'interest_level':['medium','high','low', 'low', 'medium']})
print (df)
  interest_level
0         medium
1           high
2            low
3            low
4         medium

d = {'low':1,'medium':2,'high':3}
df['interest_level'] = df['interest_level'].map(d)
print (df)
   interest_level
0               2
1               3
2               1
3               1
4               2

另一种解决方案是投放到Categorical,然后使用cat.codes

categories = ['low','medium','high']
df['interest_level'] = df['interest_level'].astype('category',
                                                    categories=categories,
                                                    ordered=True).cat.codes + 1
print (df)
   interest_level
0               2
1               3
2               1
3               1
4               2