我想知道熊猫中是否有任何功能允许我这样做。
我有一个级别为[低,中,高]的列。
我想将它们翻译成[1,2,3]来执行线性回归。但是,我目前正在做的是df[df['interest_level'] == 'low'] = 1
。有更好的方法吗?
感谢。
答案 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