Преобразование столбца Pandas Dataframe в один ярлык

У меня есть датафрейм панд, похожий на этот:

  Col1   ABC
0  XYZ    A
1  XYZ    B
2  XYZ    C

Используя панд get_dummies() Функция на столбце ABC, я могу получить это:

  Col1   A   B   C
0  XYZ   1   0   0
1  XYZ   0   1   0
2  XYZ   0   0   1

Хотя мне нужно что-то вроде этого, где столбец ABC имеет list / array тип данных:

  Col1    ABC
0  XYZ    [1,0,0]
1  XYZ    [0,1,0]
2  XYZ    [0,0,1]

Я пытался использовать get_dummies функция, а затем объединение всех столбцов в столбец, который я хотел. Я нашел много ответов, объясняющих, как объединить несколько столбцов в виде строк, например: Объединить два столбца текста в dataframe в pandas / python. Но я не могу найти способ объединить их в список.

Этот вопрос ввел идею использования склеарна OneHotEncoder, но я не мог заставить его работать. Как горячим образом закодировать один столбец кадра данных Pandas?

Еще одна вещь: у всех ответов, с которыми я столкнулся, были решения, в которых имена столбцов нужно было вводить вручную при их объединении. Есть ли способ использовать Dataframe.iloc() или механизм объединения для объединения столбцов в список?

4 ответа

Решение

Вот пример использования sklearn.preprocessing.LabelBinarizer:

In [361]: from sklearn.preprocessing import LabelBinarizer

In [362]: lb = LabelBinarizer()

In [363]: df['new'] = lb.fit_transform(df['ABC']).tolist()

In [364]: df
Out[364]:
  Col1 ABC        new
0  XYZ   A  [1, 0, 0]
1  XYZ   B  [0, 1, 0]
2  XYZ   C  [0, 0, 1]

Альтернатива панд:

In [370]: df['new'] = df['ABC'].str.get_dummies().values.tolist()

In [371]: df
Out[371]:
  Col1 ABC        new
0  XYZ   A  [1, 0, 0]
1  XYZ   B  [0, 1, 0]
2  XYZ   C  [0, 0, 1]

Вы можете просто использовать tolist():

df['ABC'] = pd.get_dummies(df.ABC).values.tolist()

  Col1        ABC
0  XYZ  [1, 0, 0]
1  XYZ  [0, 1, 0]
2  XYZ  [0, 0, 1]

Если у вас есть pd.DataFrame, как это:

>>> df
  Col1  A  B  C
0  XYZ  1  0  0
1  XYZ  0  1  0
2  XYZ  0  0  1

Вы всегда можете сделать что-то вроде этого:

>>> df.apply(lambda s: list(s[1:]), axis=1)
0    [1, 0, 0]
1    [0, 1, 0]
2    [0, 0, 1]
dtype: object

Обратите внимание, что это по существу цикл for для строк. Обратите внимание, столбцы не имеют list типы данных, они должны быть objectчто сделает ваши операции с фреймами данных не в состоянии воспользоваться преимуществами скорости numpy,

Если у вас есть фрейм данных df с категориальной колонкой ABC тогда вы могли бы использовать для создания нового столбца из горячих векторов

df['new_column'] = list(pandas.get_dummies(df['AB]).get_values())
Другие вопросы по тегам