我希望在将get_dummies()
应用于特定子列时保持列的多级结构。
例如,给定数据帧:
In [1]: df = pd.DataFrame({('A','one'):['a','a','b'],
('A','two'):['b','a','a'],
('B','one'):['b','b','a'],
('B','two'):['a','a','a'],
('C','one'):['b','a','b'],
('C','two'):['a','b','a'],})
df
Out[1]:
A B C
one two one two one two
0 a b b a b a
1 a a b a a b
2 b a a a b a
我希望按照以下方式制作一些内容:
A B C
one_a one_b two one_a one_b two one_a one_b two
0 1 0 b 0 1 a 0 1 a
1 1 0 a 0 1 a 1 0 b
2 0 1 a 1 0 a 0 1 a
如何制作与上述类似的结果?如何将子列编码为单热矢量而不影响数据帧的多级结构?
我已经尝试了下面的代码,我理解为什么它不起作用。我不能插入两列代替一列。
In [2]: df.loc[:, (slice(None),'one')] = pd.get_dummies(df.loc[:, (slice(None),'one')])
df
Out[2]:
A B C
one two one two one two
0 NaN b NaN a NaN a
1 NaN a NaN a NaN b
2 NaN a NaN a NaN a
我知道我也可以将drop_first=True
与get_dummies()
一起使用,但这会给我一列而不是两列,只适用于二进制变量。
答案 0 :(得分:3)
熊猫福
def f(d, n, k):
d = d[n]
o = d.pop(k)
return pd.get_dummies(o, prefix=k).join(d)
pd.concat({n: f(d, n, 'one') for n, d in df.groupby(axis=1, level=0)}, axis=1)
A B C
one_a one_b two one_a one_b two one_a one_b two
0 1 0 b 0 1 a 0 1 a
1 1 0 a 0 1 a 1 0 b
2 0 1 a 1 0 a 0 1 a
替代
{{1}}