Решите, какую категорию отбросить в pandas get_dummies()

#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