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 col3
en Nieuw c
En 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_dtypes
te gebruiken om de kolommen te selecteren en vervolgens .cat.codes
toe 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_array
is verouderd, gebruikt u Categorical
rechtstreeks
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 replace
waarden.
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 col
categorische 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 sex
een 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))