Pandas:将分类变量的值映射到预定义的虚拟列列表
我有一个分类变量,它的取值范围是已知的(比如说hour
这个变量只包含0到23之间的值),但现在并不是所有的值都有(比如我们只有从0到11点的测量数据,而12到23点的数据还没有),不过以后会添加其他的值。如果我们直接使用pandas.get_dummies()
来把这些值转换成指示变量,我们最终只会得到12个,而不是24个。有没有办法把这个分类变量的值映射到一个预定义的虚拟变量列表上呢?
下面是一个期望的行为示例:
possible_values = range(24)
hours = get_dummies_on_steroids(df['hour'], prefix='hour', levels=possible_values)
1 个回答
10
在pandas 0.15中,使用新改进的Categorical
类型:
import pandas as pd
import numpy as np
df = pd.DataFrame({'hour': [0, 1, 3, 8, 13, 14], 'val': np.random.randn(6)})
df
Out[4]:
hour val
0 0 -0.098287
1 1 -0.682777
2 3 1.000749
3 8 -0.558877
4 13 1.423675
5 14 1.461552
df['hour_cat'] = pd.Categorical(df['hour'], categories=range(24))
pd.get_dummies(df['hour_cat'])
Out[6]:
0 1 2 3 4 5 6 7 8 9 ...
0 1 0 0 0 0 0 0 0 0 0 ...
1 0 1 0 0 0 0 0 0 0 0 ...
2 0 0 0 1 0 0 0 0 0 0 ...
3 0 0 0 0 0 0 0 0 1 0 ...
4 0 0 0 0 0 0 0 0 0 0 ...
5 0 0 0 0 0 0 0 0 0 0 ...
你提到的情况是这样的:你知道你的数据可以取一组特定的值,但你可能并没有观察到所有这些值。这正是Categorical
类型擅长处理的事情。