[英]Pandas get_dummies() on multilevel columns
在将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()
,但这将给我一列而不是两列,并且仅适用于二进制变量。
熊猫福
pd.get_dummies(df.stack(0).one, prefix='one').stack().unstack(0).T.join(
df.xs('two', axis=1, level=1, drop_level=False)
).sort_index(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
替代
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.