Панды get_dummies на нескольких столбцах - PullRequest
0 голосов
/ 26 августа 2018

У меня есть набор данных с несколькими столбцами, которые я хочу горячо кодировать.Однако я не хочу иметь кодировку для каждого из них, поскольку указанные столбцы связаны с указанными элементами.То, что я хочу, это один «набор» переменных-пустышек, который использует все столбцы.См. Мой код для лучшего объяснения.

Предположим, мой фрейм данных выглядит следующим образом:

In [103]: dum = pd.DataFrame({'ch1': ['A', 'C', 'A'], 'ch2': ['B', 'G', 'F'], 'ch3': ['C', 'D', 'E']})

In [104]: dum
Out[104]:
 ch1 ch2 ch3
0   A   B   C
1   C   G   D
2   A   F   E

Если я выполню

pd.get_dummies(dum)

Вывод будет

   ch1_A  ch1_C  ch2_B  ch2_F  ch2_G  ch3_C  ch3_D  ch3_E
 0      1      0      1      0      0      1      0      0
 1      0      1      0      0      1      0      1      0
 2      1      0      0      1      0      0      0      1

Однако я хотел бы получить что-то вроде этого:

 A B C D E F G
 1 1 1 0 0 0 0
 0 0 1 1 0 0 1
 1 0 0 0 1 1 0

Вместо того, чтобы иметь несколько столбцов, представляющих кодировку, например, ch1_A и ch1_C, я бы хотел иметь толькоодна группа (A, B и т. д.) со значением 1 при обнаружении любого из значений в столбцах ch1, ch2, ch3.

Для уточненияв моем исходном наборе данных одна строка не будет содержать одно и то же значение (A, B, C ...) более одного раза;он просто появится в одном из столбцов.

Ответы [ 4 ]

0 голосов
/ 26 августа 2018

Использование stack и str.get_dummies

dum.stack().str.get_dummies().sum(level=0)
Out[938]: 
   A  B  C  D  E  F  G
0  1  1  1  0  0  0  0
1  0  0  1  1  0  0  1
2  1  0  0  0  1  1  0
0 голосов
/ 26 августа 2018

Назовите это так

x = pd.get_dummies(dum, prefix="", prefix_sep="")

А затем напечатайте, используя

print(x.to_string(index=False))
0 голосов
/ 26 августа 2018

Вы можете создать макеты для отдельных столбцов и объединить результаты:

temp = pd.concat([pd.get_dummies(dum[col]) for col in dum], axis=1)

    A   C   B   F   G   C   D   E
0   1   0   1   0   0   1   0   0
1   0   1   0   0   1   0   1   0
2   1   0   0   1   0   0   0   1

temp.groupby(level=0, axis=1).sum()

    A   B   C   D   E   F   G
0   1   1   1   0   0   0   0
1   0   0   1   1   0   0   1
2   1   0   0   0   1   1   0
0 голосов
/ 26 августа 2018

Вы можете использовать pd.crosstab для создания таблицы частот:

import pandas as pd

dum = pd.DataFrame({'ch1': ['A', 'C', 'A'], 'ch2': ['B', 'G', 'F'], 'ch3': ['C', 'D', 'E']})

stacked = dum.stack()
index = stacked.index.get_level_values(0)
result = pd.crosstab(index=index, columns=stacked)
result.index.name = None
result.columns.name = None

print(result)

yields

   A  B  C  D  E  F  G
0  1  1  1  0  0  0  0
1  0  0  1  1  0  0  1
2  1  0  0  0  1  1  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...