Панды get_dummies () на многоуровневых столбцах - PullRequest
0 голосов
/ 20 мая 2018

Я хотел бы сохранить многоуровневую структуру моих столбцов, применяя 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(), но это даст мне один столбец вместо двух и будет работать только для двоичных переменных.

1 Ответ

0 голосов
/ 20 мая 2018

Панда-фу

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...