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 errors
kulcsszó é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 NaN
vagy 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.