Объекты pandas.DataFrame и pandas.Series действуют по-разному для pandas.get_dummies () - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть dataframe по названию поезда с колонкой «качество».

>>>train['quality'].unique()
array([5, 6, 7, 4, 8, 3], dtype=int64)

Сейчас get_dummies с train[['quality']] дает

>>>pd.get_dummies(train[['quality']]).head()

    quality
0   5
1   5
2   5
3   6
4   5

, но с train['quality']

>>>pd.get_dummies(train['quality']).head()

    3   4   5   6   7   8
0   0   0   1   0   0   0
1   0   0   1   0   0   0
2   0   0   1   0   0   0
3   0   0   0   1   0   0
4   0   0   1   0   0   0

Типы данных train[['quality']] и train['quality']: -

>>>print(type(train['quality']))
<class 'pandas.core.series.Series'>
>>>print(type(train[['quality']]))
<class 'pandas.core.frame.DataFrame'>

get_dummies() состояния документа: data : array-like, Series, or DataFrame

Итакесли я могу дать как серию, так и DataFrame, тогда почему выходы разные?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Для работы get_dummies данные должны быть преобразованы в категориальные типы.Если серия передается, преобразование происходит автоматически.Как указано в документации и в coldspeed, при передаче DataFrame все dtypes объекта или категории (серии этих типов данных) преобразуются в категориальные и приводят к фиктивным столбцам.Например:

pandas.get_dummies(pandas.DataFrame(list("abcdabcd"))) 

   0_a  0_b  0_c  0_d
0    1    0    0    0
1    0    1    0    0
2    0    0    1    0
3    0    0    0    1
4    1    0    0    0
5    0    1    0    0
6    0    0    1    0
7    0    0    0    1

Это работает, потому что список строк становится столбцом строк, которые являются объектами.

Возможно, немного неинтуитивно, ваш столбец целочисленного типа не имеет типа "объект""и, следовательно, не преобразуется в категориальные, поэтому фиктивные столбцы не возвращаются, а возвращается исходный DataFrame.Числовые типы в пандах отличаются от объектов.Вы можете обойти это, просто передав df [["quality"]]. Astype ("category"), так как это приведет к преобразованию целочисленного столбца в категориальный, который затем будет возвращать фиктивные столбцы.

EDIT:Чтобы немного расширить, нужно помнить, что фиктивные переменные являются конструкцией для регрессии (или расширения регрессии).Если Dataframe содержит dtypes как числовые, так и объекты, чаще всего числовые типы предназначены для непосредственного использования в качестве входных данных для модели.Однако типы объектов не имеют значения в регрессии, если не преобразованы в фиктивные переменные.Таким образом, если кто-то передаст get_dummies объект DataFrame с тремя числовыми типами и одним типом объекта, один тип объекта будет преобразован в фиктивную переменную. Это поведение по умолчанию, только если параметр columns не указан .Параметр columns существует в случае, если поведение по умолчанию не соответствует вашим потребностям, например, вы не хотите, чтобы все столбцы объекта / категориальные dtype были преобразованы, или вы хотите преобразовать столбец числового dtype.

0 голосов
/ 10 декабря 2018

Документация pd.get_dummies довольно ясно показывает это:

columns: в виде списка, по умолчанию None
Имена столбцов в DataFrame должны бытьзакодирован.Если столбцов нет, то все столбцы с типом объекта или категории будут преобразованы.

Таким образом, решение состоит в том, чтобы либо указать параметр columns, что переопределит требование для столбца быть категоричным/ тип объекта для начала,

pd.get_dummies(df, columns=['quality'])

   quality_5  quality_6
0          1          0
1          1          0
2          1          0
3          0          1
4          1          0

Или преобразовать столбец в категориальный.

pd.get_dummies(df[['quality']].astype('category'))

   quality_5  quality_6
0          1          0
1          1          0
2          1          0
3          0          1
4          1          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...