Предположим, у меня есть фрейм данных со странами, который выглядит так:
cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0
Я знаю, что есть функция pd.get_dummies для преобразования стран в «горячие кодировки». Однако я хочу вместо этого преобразовать их в индексы, чтобы получить cc_index = [1,2,1,3]
вместо них.
Я предполагаю, что есть более быстрый способ, чем использование get_dummies вместе с предложением numpy where, как показано ниже:
[np.where(x) for x in df.cc.get_dummies().values]
Это несколько проще сделать в R, используя «факторы», поэтому я надеюсь, что у панд есть что-то похожее.
cc_index = [0,1,0,2]
?Ответы:
Сначала измените тип столбца:
Теперь данные выглядят похоже, но хранятся категорично. Чтобы записать коды категорий:
df['code'] = df.cc.cat.codes
Теперь у вас есть:
cc temp code 0 US 37.0 2 1 CA 12.0 1 2 US 35.0 2 3 AU 20.0 0
Если вы не хотите изменять свой DataFrame, а просто получите коды:
df.cc.astype('category').cat.codes
Или используйте категориальный столбец в качестве индекса:
источник
df.cc.cat.codes
кажется, изменился на простоdf.cc.codes
?NaN
как-1
?Если вы хотите только преобразовать свою серию в целочисленные идентификаторы, вы можете использовать
pd.factorize
.Обратите внимание, что это решение, в отличие от него
pd.Categorical
, не будет сортировать по алфавиту. Таким образом, будет назначена первая страна0
. Если вы хотите начать с1
, вы можете добавить константу:df['code'] = pd.factorize(df['cc'])[0] + 1 print(df) cc temp code 0 US 37.0 1 1 CA 12.0 2 2 US 35.0 1 3 AU 20.0 3
Если вы хотите отсортировать по алфавиту, укажите
sort=True
:df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1
источник
Если вы используете
sklearn
библиотеку, вы можете использоватьLabelEncoder
. Напримерpd.Categorical
, входные строки сортируются по алфавиту перед кодированием.from sklearn.preprocessing import LabelEncoder LE = LabelEncoder() df['code'] = LE.fit_transform(df['cc']) print(df) cc temp code 0 US 37.0 2 1 CA 12.0 1 2 US 35.0 2 3 AU 20.0 0
источник
Попробуйте это, конвертируйте в число на основе частоты (высокая частота - большое число):
labels = df[col].value_counts(ascending=True).index.tolist() codes = range(1,len(labels)+1) df[col].replace(labels,codes,inplace=True)
источник
Изменит любые столбцы на числа. Он не создаст новый столбец, а просто заменит значения числовыми данными.
def characters_to_numb(*args): for arg in args: df[arg] = pd.Categorical(df[arg]) df[arg] = df[arg].cat.codes return df
источник
Однострочный код:
df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes)
Это также работает, если у вас есть
list_of_columns
:df[list_of_columns] = df[list_of_columns].apply(lambda col:pd.Categorical(col).codes)
Кроме того, если вы хотите сохранить свои
NaN
значения, вы можете применить замену:df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes).replace(-1,np.nan)
источник