Pandas veri çerçevesindeki kategorik verileri dönüştürme


107

Bu tür verilere sahip bir veri çerçevem ​​var (çok fazla sütun):

col1        int64
col2        int64
col3        category
col4        category
col5        category

Sütunlar şuna benzer:

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

Sütunlardaki tüm değerleri tam sayıya şu şekilde dönüştürmek istiyorum:

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

Bunu bir sütun için şu şekilde çözdüm:

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

Şimdi veri çerçevemde iki sütun var - eski col3ve yeni cve eski sütunları bırakmam gerekiyor.

Bu kötü bir uygulama. İşe yarıyor ama veri çerçevemde birçok sütun var ve bunu elle yapmak istemiyorum.

Bu nasıl pitonik ve sadece akıllıca?

Yanıtlar:


172

İlk olarak, onun sayısal kodlara bir Kategorik sütunu dönüştürmek için, sizinle bu daha kolay yapabilirsiniz: dataframe['c'].cat.codes.
Ayrıca bir veri çerçevesindeki belirli bir dtype sahip tüm sütunları kullanarak otomatik olarak seçmek mümkündür select_dtypes. Bu şekilde, yukarıdaki işlemi birden çok ve otomatik olarak seçilen sütunlara uygulayabilirsiniz.

Önce bir örnek veri çerçevesi oluşturalım:

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

Ardından select_dtypessütunları seçmek için düğmesini kullanarak ve ardından .cat.codesbu sütunların her birine uygulayarak aşağıdaki sonucu elde edebilirsiniz:

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

14
Kategori kodu ve kategori dizesi değerleri arasında eşleme yapmanın kolay bir yolu var mı?
Allan Ruin

5
df['col2'].cat.categoriesÖrneğin : kullanabilirsiniz .
ogrisel

13
Bunun NaNbenzersiz bir şekilde haritalanacağından endişelenen herkese işaret-1
quietContest

2
2 gömlekleri seviyorum;)
Jose A

Eğer kategorik sıralıysa (bir sıra), o zaman döndürülen sayısal kodların cat.codesSeride gördükleriniz OLMAYABİLİR!
paulperry

27

Bu benim için çalışıyor:

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

Çıktı:

[0, 1, 2, 0]

20

Endişeniz yalnızca fazladan bir sütun yapmak ve daha sonra silmekse, ilk başta yeni bir sütun kullanın.

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

Bitirdiniz. Artık Categorical.from_arraykullanımdan kaldırıldığı gibi , Categoricaldoğrudan kullanın

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

Dizinden etikete geri eşlemeye de ihtiyacınız varsa, aynısı için daha iyi bir yol var

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

aşağıyı kontrol et

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

11

Burada birden çok sütunun dönüştürülmesi gerekiyor. Yani, kullandığım yaklaşımlardan biri ..

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

Bu, tüm dizgi / nesne türü sütunlarını kategoriklere dönüştürür. Ardından her kategori türüne kodlar uygular.


3

Veri kümesi verilerinin C sütunundaki kategorik verileri dönüştürmek için aşağıdakileri yapmamız gerekir:

from sklearn.preprocessing import LabelEncoder 
labelencoder= LabelEncoder() #initializing an object of class LabelEncoder
data['C'] = labelencoder.fit_transform(data['C']) #fitting and transforming the desired categorical column.

2

Yaptığım şey, replacedeğer veriyorum .

Bunun gibi-

df['col'].replace(to_replace=['category_1', 'category_2', 'category_3'], value=[1, 2, 3], inplace=True)

Bu şekilde, colsütun kategorik değerlere sahipse, sayısal değerlerle değiştirilir.


1

@ Quickbeam2k1, aşağıya bakın -

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

Sklearn kullanma görüntü açıklamasını buraya girin

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

3
Neden önceki cevabınızı düzeltmediniz? Şaşırtıcı bir şekilde, labelencoder tanımını fit_transformyerine şimdi kullanıyorsunuz transform_fitve düzelttiniz. Neden kullanıyorsun iloc[:,:]? bu işe yaramaz. Görüntünün arkasındaki sebep nedir? Beni ve @ theGtknerd wrond'u ispatlamak istemeniz durumunda başarısız oldunuz.
Quickbeam2k1

0

Belirli bir sütun için, sıralamayı önemsemiyorsanız, bunu kullanın

df['col1_num'] = df['col1'].apply(lambda x: np.where(df['col1'].unique()==x)[0][0])

Sipariş vermeyi önemsiyorsanız, bunları bir liste olarak belirtin ve bunu kullanın

df['col1_num'] = df['col1'].apply(lambda x: ['first', 'second', 'third'].index(x))

0

Kategorik değişkeni kukla / gösterge değişkenlere dönüştürmenin en basit yollarından biri, pandalar tarafından sağlanan get_dummies'i kullanmaktır . Örneğin, içinde sexkategorik bir değer olan (erkek ve kadın) bir veriye sahip olduğumuzu ve onu bir kukla / göstergeye dönüştürmeniz gerektiğini varsayalım, işte nasıl yapılacağı.

tranning_data = pd.read_csv("../titanic/train.csv")
features = ["Age", "Sex", ] //here sex is catagorical value
X_train = pd.get_dummies(tranning_data[features])
print(X_train)

Age Sex_female Sex_male
20    0          1
33    1          0
40    1          0
22    1          0
54    0          1


0

Bunu aşağıdaki gibi daha az kod yapabilirsiniz:

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

f['col1'] =f['col1'].astype('category').cat.codes
f['col2'] =f['col2'].astype('category').cat.codes
f['col3'] =f['col3'].astype('category').cat.codes

f

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.