Birden çok kategorik sütunu dönüştürme


10

Veri setimde numaralandırmak istediğim iki kategorik sütun var. İki sütunun her ikisi de ülkeler içerir, bazıları çakışır (her iki sütunda da görünür). Aynı ülke için aynı numarayı sütun1 ve sütun2'de vermek istiyorum.

Verilerim şöyle görünüyor:

import pandas as pd

d = {'col1': ['NL', 'BE', 'FR', 'BE'], 'col2': ['BE', 'NL', 'ES', 'ES']}
df = pd.DataFrame(data=d)
df

Şu anda veri gibi dönüştürüyorum:

from sklearn.preprocessing import LabelEncoder
df.apply(LabelEncoder().fit_transform)

Ancak bu FR ve ES arasında bir ayrım yapmaz. Aşağıdaki çıktıya gelmenin başka bir basit yolu var mı?

o = {'col1': [2,0,1,0], 'col2': [0,2,4,4]}
output = pd.DataFrame(data=o)
output

Yanıtlar:


8

İşte bir yol

df.stack().astype('category').cat.codes.unstack()
Out[190]: 
   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1

Veya

s=df.stack()
s[:]=s.factorize()[0]
s.unstack()
Out[196]: 
   col1  col2
0     0     1
1     1     0
2     2     3
3     1     3

5

LabelEncoder () öğesini önce veri çerçevenizdeki benzersiz değerlerle sığdırabilir ve sonra dönüştürebilirsiniz.

le = LabelEncoder()
le.fit(pd.concat([df.col1, df.col2]).unique()) # or np.unique(df.values.reshape(-1,1))

df.apply(le.transform)
Out[28]: 
   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1

2

np.uniqueile return_invesere. Yine de DataFrame'i yeniden yapılandırmanız gerekir.

pd.DataFrame(np.unique(df, return_inverse=True)[1].reshape(df.shape),
             index=df.index,
             columns=df.columns)

   col1  col2
0     3     0
1     0     3
2     2     1
3     0     1
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.