Change oszlop típusa pandák

négy fő lehetőség konvertáló típusok pandák:

olvassa el a részletesebb magyarázatok és használat az egyes ilyen módszerek.

a DataFrame egy vagy több oszlopának numerikus értékekké történő konvertálásának legjobb módja a pandas.to_numeric()használata.

Ez a funkció megpróbálja megváltoztatni a nem numerikus objektumokat (például karakterláncokat) egész számokra vagy lebegőpontos számokra.

Basic usage

ato_numeric() bemenet egy DataFrame sorozat vagy egyetlen oszlop.,

mint látható, egy új sorozat visszatér. Ne felejtse el hozzárendelni ezt a kimenetet egy változóhoz vagy oszlopnévhez, hogy továbbra is használja:

# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)

használhatja azt is, hogy az Adatframe több oszlopát konvertálja a apply() módszer:

p > mindaddig, amíg az értékek mind konvertálhatók, ez valószínűleg minden, amire szüksége van.

hibakezelés

de mi van, ha egyes értékeket nem lehet numerikus típusra konvertálni?,

to_numeric()is vesz egy errorskulcsszó érv, amely lehetővé teszi, hogy kényszeríteni nem numerikus értékeket, hogy NaN, vagy egyszerűen figyelmen kívül hagyja oszlopok ezeket az értékeket.

itt van egy példa egy sor karakterláncok s amely az objektum dtype:

Az alapértelmezett viselkedés emelni, ha nem tudja átalakítani egy értéket., Ebben az esetben nem tud megbirkózni a”pandák”karakterlánccal:

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string

nem sikerül, inkább azt szeretnénk, ha a “pandák” hiányzó/rossz numerikus értéknek tekinthetők., Tudjuk kényszeríteni érvénytelen értékek NaN a következőképpen használja a errors kulcsszó érv:

>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64

A harmadik lehetőség a errors csak az, hogy figyelmen kívül hagyja a művelet, ha értéke érvénytelen találkozott:

>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched

Ez az utolsó lehetőség különösen hasznos, ha ön akar-hoz megtérít a teljes DataFrame, de nem tudom, melyik az oszlopok alakítható, megbízhatóan, hogy egy numerikus típus., Ebben az esetben csak írja:

df.apply(pd.to_numeric, errors='ignore')

a függvény az Adatframe minden oszlopára vonatkozik. A numerikus típusra konvertálható oszlopok átalakításra kerülnek, míg azok az oszlopok, amelyek nem tudnak (például nem számjegyű karakterláncokat vagy dátumokat tartalmaznak), egyedül maradnak.

Downcasting

alapértelmezés szerint a to_numeric() – val történő konverzió vagy a int64 vagy float64 dtype (vagy bármilyen egész szélesség natív a platformon).,

Ez általában az, amit akarsz, de mi van, ha azt akarta, hogy mentse néhány memóriát, és egy kompaktabb dtype, mint a float32, vagy int8?

>>> s = pd.Series()>>> s0 11 22 -7dtype: int64

Downcasting, hogy ‘integer’ használja a legkisebb egész szám, hogy tartani tudja az értékek:

>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8

Downcasting, hogy ‘float’ hasonlóképpen veszi kisebb, mint a normál lebegő típus:

>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32

astype()

A astype() a módszer lehetővé teszi, hogy kifejezetten a dtype azt szeretné, hogy a DataFrame vagy Sorozat van., Nagyon sokoldalú, hogy megpróbálhat egyik típusról a másikra menni.

alapvető használat

hívja a konvertálni kívánt objektum módszerét, ésastype() megpróbálja konvertálni az Ön számára:

megjegyzés azt mondtam, hogy “próbálja meg” – haastype() nem tudja, hogyan kell konvertálni egy értéket a sorozatban vagy a DataFrame-ben, hibát fog okozni. Például, ha van egy NaNvagy inf érték kapsz egy hiba próbál átalakítani, hogy egy egész szám.

a Panda 0.20.,0, ez a hiba elnyomható a errors='ignore'átadásával. Az eredeti tárgy érintetlen lesz.

legyen óvatos

astype() erős, de néha”helytelenül” konvertálja az értékeket. Például:

>>> s = pd.Series()>>> s0 11 22 -7dtype: int64

ezek kis egész számok, tehát mi lenne, ha aláíratlan 8 bites típusra konvertálnánk a memória mentéséhez?

>>> s.astype(np.uint8)0 11 22 249dtype: uint8

az átalakítás működött, de a -7 – et körbeforgatták, hogy 249 legyen (azaz 28-7)!

a pd.to_numeric(s, downcast='unsigned') használatával történő downcast próbálkozás segíthet megakadályozni ezt a hibát.,

infer_objects ()

a pandák 0.21.0-s verziója bevezette a infer_objects() módszert egy olyan adattípus oszlopainak konvertálására, amelyek objektumadattípussal rendelkeznek egy konkrét típusra (lágy konverziók).

például itt van egy adatframe két objektumtípus oszlopával. Az egyikben tényleges egész számok vannak, a másikban pedig egészeket ábrázoló karakterláncok:

>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object

a infer_objects() segítségével az”A”oszlop típusát int64-re változtathatja:

oszlop ” B ” oszlopa egyedül maradt, mivel értékei sztringek voltak, nem egész számok., Ha meg akarta próbálni mindkét oszlop egész számra történő átalakítását, akkor helyette a df.astype(int) parancsot használhatja.

convert_dtypes ()

1.0 vagy újabb verzió tartalmaz egy módszert convert_dtypes() A sorozat-és DataFrame-oszlopok konvertálása a lehető legjobb dtype-ra, amely támogatja a pd.NA hiányzó értéket.

itt a “lehető legjobb” azt a típust jelenti, amely a legmegfelelőbb az értékek megtartásához., Például, ez egy pandas integer Típus, ha az összes érték egész (vagy hiányzó értékek): egy objektum oszlop Python integer objektumok alakítjuk Int64, egy oszlop NumPy int32 értékek lesz a pandas dtype Int32.,

a DataFrame df a következő eredményt kapjuk:

>>> df.convert_dtypes().dtypes a Int64b stringdtype: object

mivel az”A”oszlop egész számértékeket tartott, a Int64 típus (amely képes hiányzó értékeket tartani, ellentétben a int64).

A ” b “oszlop karakterlánc objektumokat tartalmazott, így pandákra változott’ string dtype.

alapértelmezés szerint ez a módszer az egyes oszlopokban lévő objektumértékek típusát határozza meg., Ezt úgy változtathatjuk meg, hogy a infer_objects=False:

>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object

most az”A”oszlop objektum oszlop maradt: a pandas tudja, hogy “egész” oszlopként írható le (belsőleg infer_dtype), de nem pontosan meghatározta, hogy milyen egész dtype-nek kellett volna lennie nem átalakítani. A ” b “oszlopot ismét” string “dtype-ra konvertálták, mivel azt “string” értékeknek tartották.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük