#python #pandas #categorical-data #one-hot-encoding #dummy-variable
#python #pandas #категориальный-данные #one-hot-encoding #фиктивная переменная
Вопрос:
Допустим, у меня есть следующий df:
data = [{'c1':a, 'c2':x}, {'c1':b,'c2':y}, {'c1':c,'c2':z}]
df = pd.DataFrame(data)
Output:
c1 c2
0 a x
1 b y
2 c z
Теперь я хочу использовать pd.get_dummies() для одного горячего кодирования двух категориальных столбцов c1 и c2 и удаления первой категории каждого столбца pd.get_dummies(df, columns = ['c1', 'c2'], drop_first=True)
. Как я могу решить, какую категорию отбросить, не зная порядка строк? Есть ли какая-либо команда, которую я пропустил?
РЕДАКТИРОВАТЬ: итак, моей целью было бы, например, удалить категорию b
из c1
и z
из c2
Output:
a c x y
0 1 0 1 0
1 0 0 0 1
2 0 1 0 0
Комментарии:
1. Итак, нужно удалить, например, для первого столбца вторую категорию, для второго столбца первую? Не уверен, что понимаю.
2. Да. Мне тоже трудно понять ваше определение того, что является первым! @TiTo
Ответ №1:
Один трюк заключается в замене значений на NaN
s — здесь удаляется по одному значению на строки:
#columns with values for avoid
d = {'c1':'b', 'c2':'z'}
d1 = {k:{v: np.nan} for k, v in d.items()}
df = pd.get_dummies(df.replace(d1), columns = ['c1', 'c2'], prefix='', prefix_sep='')
print (df)
a c x y
0 1 0 1 0
1 0 0 0 1
2 0 1 0 0
Если требуется несколько значений для удаления для каждого столбца, используйте такие списки, как:
d = {'c1':['b','c'], 'c2':['z']}
d1 = {k:{x: np.nan for x in v} for k, v in d.items()}
print (d1)
{'c1': {'b': nan, 'c': nan}, 'c2': {'z': nan}}
df = pd.get_dummies(df.replace(d1), columns = ['c1', 'c2'], prefix='', prefix_sep='')
print (df)
a x y
0 1 1 0
1 0 0 1
2 0 0 0
Редактировать:
Если значения уникальны для каждого столбца, проще удалить их на последнем шаге:
df = (pd.get_dummies(df, columns = ['c1', 'c2'], prefix='', prefix_sep='')
.drop(['b','z'], axis=1))
print (df)
a c x y
0 1 0 1 0
1 0 0 0 1
2 0 1 0 0
Ответ №2:
Я бы настоятельно рекомендовал использовать sklearn
вместо этого! https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing .OneHotEncoder.html
Вы можете просмотреть категории, обращающиеся к <your_fitted_instance_name>.categories_
атрибуту, после установки one hot encoder, и у него также есть inverse_transform()
функция для отмены one hot encoding!
Что касается удаления столбцов.. по умолчанию не отбрасывается ни одна. Однако вы можете использовать OneHotEncoder(drop='first')
для того, чтобы отбросить одну.
Редактировать: также обратите внимание, что sklearn
предлагает конвейеры, которые могут помочь вам обеспечить согласованную предварительную обработку на протяжении всего вашего проекта! https://scikit-learn.org/stable/modules/generated/sklearn.pipeline .Pipeline.html