Подтвердить что ты не робот

Преобразование категориальных данных в pandas dataframe

У меня есть dataframe с данным типом данных (слишком много столбцов):

col1        int64
col2        int64
col3        category
col4        category
col5        category

Столбцы выглядят так:

Name: col3, dtype: category
Categories (8, object): [B, C, E, G, H, N, S, W]

Я хочу преобразовать все значения в столбцах в целое число следующим образом:

[1, 2, 3, 4, 5, 6, 7, 8]

Я решил это для одного столбца следующим образом:

dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes

Теперь у меня есть два столбца в моем фреймворке данных - old 'col3' и new 'c', и вам нужно отбросить старые столбцы.

Плохая практика. Он работает, но в моей области данных много столбцов, и я не хочу делать это вручную.

Как это питонов и просто умно?

4b9b3361

Ответ 1

Во-первых, чтобы преобразовать столбцы категории в его числовые коды, вы можете сделать это проще: dataframe['c'].cat.codes.
Кроме того, можно автоматически выбрать все столбцы с определенным dtype в кадре данных с помощью select_dtypes. Таким образом, вы можете применить операцию выше для нескольких и автоматически выбранных столбцов.

Сначала создадим примерный кадр:

In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})

In [76]: df['col2'] = df['col2'].astype('category')

In [77]: df['col3'] = df['col3'].astype('category')

In [78]: df.dtypes
Out[78]:
col1       int64
col2    category
col3    category
dtype: object

Затем, используя select_dtypes, чтобы выбрать столбцы, а затем применив .cat.codes в каждом из этих столбцов, вы можете получить следующий результат:

In [80]: cat_columns = df.select_dtypes(['category']).columns

In [81]: cat_columns
Out[81]: Index([u'col2', u'col3'], dtype='object')

In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

In [84]: df
Out[84]:
   col1  col2  col3
0     1     0     0
1     2     1     1
2     3     2     0
3     4     0     1
4     5     1     1

Ответ 2

Если вы беспокоились только о том, что вы делаете дополнительный столбец и удаляете его позже, просто используйте dun, используя первый столбец на первом месте.

dataframe = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})
dataframe.col3 = pd.Categorical.from_array(dataframe.col3).codes

Вы закончили. Теперь, когда Categorical.from_array устарел, используйте Categorical непосредственно

dataframe.col3 = pd.Categorical(dataframe.col3).codes

Если вам также нужно отобразить обратно из индекса в метку, есть еще лучший способ для того же

dataframe.col3, mapping_index = pd.Series(dataframe.col3).factorize()

проверьте ниже

print(dataframe)
print(mapping_index.get_loc("c"))

Ответ 3

Это работает для меня:

pandas.factorize( ['B', 'C', 'D', 'B'] )[0]

Вывод:

[0, 1, 2, 0]

Ответ 4

@Quickbeam2k1, см. ниже -

dataset=pd.read_csv('Data2.csv')
np.set_printoptions(threshold=np.nan)
X = dataset.iloc[:,:].values

Использование sklearn enter image description here

from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

Ответ 5

Здесь несколько столбцов должны быть преобразованы. Итак, один из подходов, который я использовал, это..

for col_name in df.columns:
    if(df[col_name].dtype == 'object'):
        df[col_name]= df[col_name].astype('category')
        df[col_name] = df[col_name].cat.codes

Это преобразует все столбцы типа строки/объекта в категориальные. Затем применяются коды для каждого типа категории.

Ответ 6

Это можно решить, импортировав библиотеку LabelEncoder в Python. Пожалуйста, найдите код ниже

Использование Python

Импорт библиотеки

from sklearn.preprocessing import LabelEncoder

Создание объекта для класса LabelEncoder

labelencoder=LabelEncoder()

Теперь используя метод и подгоняя закодированное значение в третьем столбце набора данных (так как индекс начинался с 0 в Python, поэтому DF.iloc[:,2] как DF.iloc[:,2] ниже -

DF.iloc[:,2] = labelencoder.fit_transform(DF.iloc[:,2])

Вы можете увидеть коды категорий в labelencoder.classes_

Используя R

Кодирование данных категории

dataset$Col3=factor(dataset$Col3,levels = c(B, C, E, G, H, N, S, W),
                                         labels = c(1,2,3,4,5,6,7,8))

и это все в R, иди и ударил это :)