Categoricale gegevens converteren in Pandas Dataframe

Ik heb een dataframe met dit type gegevens (te veel kolommen):

col1        int64
col2        int64
col3        category
col4        category
col5        category

Columns lijkt zo:

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

Ik wil alle waarde in kolommen omzetten in kolommen naar integer zoals dit:

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

Ik heb dit hiermee opgelost voor één kolom:

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

Nu heb ik twee kolommen in mijn dataframe – Oud col3en Nieuw cEn moet oude kolommen vallen.

Dat is een slechte praktijk. Het is werk, maar in mijn dataframe vele kolommen en ik wil het niet handmatig doen.

Hoe doe dit pythonic en gewoon slim?


Antwoord 1, Autoriteit 100%

Eerste, om een ​​categororale kolom naar zijn numerieke codes te converteren, kunt u dit gemakkelijker doen met: dataframe['c'].cat.codes.
Verder is het mogelijk om automatisch alle kolommen met een bepaald DTYPE in een dataframe te selecteren met select_dtypes. Op deze manier kunt u boven de bediening toepassen op meerdere en automatisch geselecteerde kolommen.

eerst een voorbeeld-dataframe maken:

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

Door vervolgens select_dtypeste gebruiken om de kolommen te selecteren en vervolgens .cat.codestoe te passen op elk van deze kolommen, krijgt u het volgende resultaat:

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

Antwoord 2, autoriteit 24%

Dit werkt voor mij:

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

Uitvoer:

[0, 1, 2, 0]

Antwoord 3, autoriteit 11%

Als uw zorg alleen was dat u een extra kolom maakt en deze later verwijdert, gebruik dan gewoon een nieuwe kolom.

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

Je bent klaar. Nu Categorical.from_arrayis verouderd, gebruikt u Categoricalrechtstreeks

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

Als u ook de toewijzing van index naar label nodig heeft, is er een nog betere manier voor hetzelfde

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

controleer hieronder

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

Antwoord 4, autoriteit 7%

Hier moeten meerdere kolommen worden geconverteerd. Dus een benadering die ik heb gebruikt is ..

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

Dit converteert alle kolommen van het string-/objecttype naar categorisch. Past vervolgens codes toe op elk type categorie.


Antwoord 5, autoriteit 4%

Wat ik doe is, ik replacewaarden.

Vind ik leuk-

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

Op deze manier worden, als de kolom colcategorische waarden heeft, deze vervangen door de numerieke waarden.


Antwoord 6, autoriteit 3%

Voor het converteren van categorische gegevens in kolom Cvan dataset gegevensmoeten we het volgende doen:

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.

Antwoord 7, autoriteit 2%

Antwoorden hier lijken verouderd. Panda’s heeft nu een factorize()functie en u kunt categorieën maken als:

df.col.factorize() 

Functiehandtekening:

pandas.factorize(values, sort=False, na_sentinel=- 1, size_hint=None)

Antwoord 8, Autoriteit 2%

Om alle kolommen in de dataframe naar numerieke gegevens te converteren:

df2 = df2.apply(lambda x: pd.factorize(x)[0])

Antwoord 9

Een van de eenvoudigste manieren om de categorische variabele om te zetten in dummy / indicatorvariabelen is het gebruik Get_dummies geleverd door Panda’s.
Zeg bijvoorbeeld dat we gegevens hebben waarin sexeen categorische waarde is (mannelijke & amp; vrouw)
En je moet het omzetten in een dummy / indicator hier is hoe het te doen.

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

Antwoord 10

@ quickbeam2k1, zie hieronder –

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

Sklearn

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

Antwoord 11

U kunt het minder code doen zoals hieronder:

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


Antwoord 12

Voor een bepaalde kolom, als u dit niet geeft om de bestelling, gebruikt u dit

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

Als u om de bestelling geeft, geef ze deze op als een lijst en gebruik deze

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

Other episodes