Změnit typ sloupce v pandy

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“.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *