多级列上的Pandas get_dummies()

时间:2018-05-20 06:14:31

标签: python pandas

我希望在将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=Trueget_dummies()一起使用,但这会给我一列而不是两列,只适用于二进制变量。

1 个答案:

答案 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}}