Преобразование столбца Pandas Dataframe в одну горячую метку

У меня есть кадр данных pandas, подобный этому:

  Col1   ABC
0  XYZ    A
1  XYZ    B
2  XYZ    C

Используя функцию pandas 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, а затем объединить все столбцы в нужный столбец. Я нашел много ответов, объясняющих, как объединить несколько столбцов в виде строк, например: pandas-python">Объедините два столбца текста в кадре данных в pandas/python. Но я не могу найти способ объединить их в список.

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

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


person Nir_J    schedule 05.11.2017    source источник
comment
где столбец ABC имеет тип данных списка/массива: почему?   -  person juanpa.arrivillaga    schedule 06.11.2017
comment
Возможный дубликат Объединить столбцов в Pandas DataFrame в столбец списков в DataFrame   -  person andrew_reece    schedule 06.11.2017


Ответы (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]
person MaxU    schedule 05.11.2017
comment
Получив столбец списков, я смог преобразовать список в массив, используя: df['new'].apply(lambda x: np.array(x)) . Есть ли прямой способ получить массив? - person Nir_J; 06.11.2017
comment
@Nir_J, я не знаю, как напрямую назначить 2D-массив Numpy одному столбцу Pandas. Панды будут думать, что мы назначаем несколько столбцов... Собственно, поэтому я использовал .tolist() - person MaxU; 06.11.2017

Вы можете просто использовать 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]
person andrew_reece    schedule 05.11.2017
comment
Вот так я и поступлю :-) Мило ~ - person BENY; 06.11.2017

Если у вас есть такой 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.

person juanpa.arrivillaga    schedule 05.11.2017
comment
Спасибо, что указали на недостаток списка. Я хотел иметь возможность использовать только этот столбец в качестве метки для обучения модели. Сможет ли это решение использовать преимущества скорости numpy? - person Nir_J; 06.11.2017
comment
@Nir_J нет. Я не уверен, что модели в sklearn все равно примут столбец из list объектов. - person juanpa.arrivillaga; 06.11.2017

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

df['new_column'] = list(pandas.get_dummies(df['AB]).get_values())
person Spandyie    schedule 16.06.2018