máte čtyři hlavní možnosti pro konverzi typů pandy:
Přečtěte si o podrobnější vysvětlení a použití každé z těchto metod.
nejlepší způsob, jak převést jeden nebo více sloupců DataFrame na číselné hodnoty, je použít pandas.to_numeric()
.
tato funkce se pokusí změnit nečíselné objekty (například řetězce) na celá čísla nebo čísla s plovoucí desetinnou čárkou podle potřeby.
Základní použití
vstup to_numeric()
je Série nebo jeden sloupec v Datovém.,
jak vidíte, vrací se nová série. Nezapomeňte přiřadit tento výstup do proměnné nebo sloupec název nadále používat:
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
můžete také použít k převést více sloupců v Datovém pomocí apply()
metoda:
tak dlouho, Jak vaše hodnoty mohou být všechny převedeny, to je asi vše, co potřebujete.
zpracování chyb
ale co když některé hodnoty nelze převést na číselný Typ?,
to_numeric()
také má errors
klíčové slovo argument, že umožňuje, aby platnost non-číselné hodnoty, které mají být NaN
, nebo jednoduše ignorovat sloupce obsahující tyto hodnoty.
Zde je příklad použití Řady řetězců s
, který má objekt dtype:
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
výchozí chování je zvýšit, pokud to nelze převést hodnotu., V tomto případě, to nemůže vyrovnat se s string ‚pandy‘:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
Spíše než to nepodaří, budeme chtít ‚pandy‘, které mají být považovány za chybějící/špatnou číselnou hodnotu., Můžeme donutit neplatné hodnoty do NaN
takto pomocí errors
klíčové slovo argument:
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
třetí volba errors
je prostě ignorovat provozu v případě neplatné hodnoty se setkal:
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
Tato poslední možnost je zvláště užitečné, pokud chcete převést celý Datovém, ale nemusíte ani vědět, který z našich sloupce lze spolehlivě převedeny na číselný typ., V tom případě stačí napsat:
df.apply(pd.to_numeric, errors='ignore')
funkce bude aplikována na každý sloupec v Datovém. Sloupce, které mohou být převedeny na číselný typ budou převedeny, zatímco sloupce, které nemůže (např. obsahují non-místné řetězce nebo data) zůstane sám.
Downcasting
ve výchozím nastavení, konverze to_numeric()
vám buď int64
nebo float64
dtype (nebo cokoliv číslo šířka je původem z vaší platformy).,
to je obvykle to, co chcete, ale co když bys chtěl ušetřit trochu paměti a použít více kompaktní dtype, jako float32
nebo int8
?
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Downcasting ‚integer‘ používá nejmenší možné číslo, které může mít hodnoty:
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
Downcasting ‚float‘ podobně vybere menší, než je obvyklé plovoucí typ:
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
astype()
metoda umožňuje být explicitní o dtype chcete vašem Datovém nebo Série., Je to velmi univerzální v tom, že se můžete pokusit přejít z jednoho typu na jiný.
Základní použití
Volání metody na objektu, který chcete převést, a astype()
se bude snažit, a převést ji pro vás:
Všimněte si, řekl jsem, „zkus to“ – pokud je astype()
neví, jak převést hodnoty v Sérii nebo Datovém, zvýší chyba. Například, pokud máte NaN
nebo inf
hodnota dostanete chybu, snaží se ji převést na celé číslo.
od Panda 0.20.,0, tato chyba může být potlačena předáním errors='ignore'
. Váš původní objekt se vrátí nedotčený.
buďte opatrní
astype()
je silný, ale někdy převede hodnoty“nesprávně“. Například:
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
jedná se o malá celá čísla, takže co převod na nepodepsaný 8bitový typ pro uložení paměti?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
konverze fungovala, ale -7 byl zabalen tak, aby se stal 249 (tj. 28 – 7)!
Pokus o downcast pomocí pd.to_numeric(s, downcast='unsigned')
místo toho by mohl pomoci zabránit této chybě.,
infer_objects()
Verze 0.21.0 pand představil metodu infer_objects()
pro převod sloupců v Datovém že mít objekt datový typ pro konkrétní typ (soft konverze).
například zde je DataFrame se dvěma sloupci typu objektu. Jeden drží skutečných čísel a druhá drží řetězce představující celá čísla:
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
Pomocí infer_objects()
, můžete změnit typ sloupce “ a “ až int64:
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
Sloupec “ b “ byl ponechán o samotě, protože její hodnoty jsou řetězce, ne celá čísla., Pokud jste chtěli vyzkoušet a vynutit převod obou sloupců na celočíselný Typ, mohli byste místo toho použít df.astype(int)
.
convert_dtypes()
Verze 1.0 a vyšší zahrnuje metodu convert_dtypes()
převést Série a Datovém sloupce nejlepší možné dtype, který podporuje pd.NA
chybějící hodnota.
zde „nejlepší možný“ znamená typ, který je nejvhodnější pro držení hodnot., Například, to pandy typu celé číslo, pokud všechny hodnoty jsou celá čísla (nebo chybějící hodnoty): objekt sloupci Pythonu celé číslo objekty převedeny na Int64
, sloupec NumPy int32
hodnoty budou pandy dtype Int32
.,
naše object
Datovém df
, dostaneme následující výsledek:
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
Od sloupce “ a “ konat celočíselné hodnoty, byl převeden do Int64
type (která je schopna pojmout chybějící hodnoty, na rozdíl od int64
).
sloupec ‚ b ‚obsahoval řetězcové objekty, takže byl změněn na pandy‘ string
dtype.
ve výchozím nastavení tato metoda odvodí typ z hodnot objektů v každém sloupci., Můžeme to změnit tím, že procházející infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
sloupec “ a „zůstal objekt, sloupec: pandy ví, to může být popsán jako „celé číslo“ sloupci (interně to běželo infer_dtype
), ale nechtěl vyvozovat přesně to, co dtype celé by to mělo mít, takže ani převést. Sloupec “ b „byl opět převeden na „string“ dtype, protože byl rozpoznán jako držení hodnot „string“.