ändra kolumntyp i pandor

Du har fyra huvudsakliga alternativ för att konvertera typer i pandor:

läs vidare för mer detaljerade förklaringar och användning av var och en av dessa metoder.

det bästa sättet att konvertera en eller flera kolumner i en dataram till numeriska värden är att använda pandas.to_numeric().

den här funktionen försöker ändra icke-numeriska objekt (t.ex. strängar) till heltal eller flyttal beroende på vad som är lämpligt.

Grundläggande användning

ingången tillto_numeric() är en serie eller en enda kolumn i en dataram.,

som du kan se returneras en ny serie. Kom ihåg att tilldela denna utmatning till en variabel eller kolumnnamn för att fortsätta använda den:

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

Du kan också använda den för att konvertera flera kolumner i en DataFrame via metoden apply():

så länge dina värden kan konverteras, är det förmodligen allt du behöver.

felhantering

men vad händer om vissa värden inte kan konverteras till en numerisk typ?,

to_numeric()tar också enerrorssökord argument som låter dig tvinga icke-numeriska värden varaNaN, eller helt enkelt ignorera kolumner som innehåller dessa värden.

här är ett exempel med en serie strängar s som har objektet dtype:

>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object

standardbeteendet är att höja om det inte kan konvertera ett värde., I det här fallet kan det inte klara strängen”pandas”:

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

i stället för att misslyckas kanske vi vill att ”pandas” ska betraktas som ett saknade/dåligt numeriskt värde., Vi kan tvinga ogiltiga värden till NaN enligt följande med hjälp av errors sökordsargumentet:

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

det tredje alternativet för errors är bara att ignorera åtgärden om ett ogiltigt värde påträffas:

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

det här sista alternativet är särskilt användbart när du vill konvertera hela din dataram, men vet inte vilken av våra kolumner som kan konverteras tillförlitligt till en numerisk typ., I så fall skriv bara:

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

funktionen kommer att tillämpas på varje kolumn i DataFrame. Kolumner som kan konverteras till en numerisk typ konverteras, medan kolumner som inte kan (t.ex. de innehåller icke-siffriga strängar eller datum) lämnas ensamma.

Downcasting

som standard kommer konvertering medto_numeric() att ge dig antingen enint64 ellerfloat64 dtype (eller oavsett heltalsbredd är infödd till din plattform).,

det är vanligtvis vad du vill, men vad händer om du vill spara lite minne och använda en mer kompakt dtype, som float32, eller int8?

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

Downcasting till ’heltal’ använder minsta möjliga heltal som kan hålla värdena:

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

Downcasting till ’float’ plockar på samma sätt en mindre än normal flytande typ:

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

astype ()

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

– metoden gör att du kan vara tydlig med vilken dtype du vill att din dataram eller serie ska ha., Det är väldigt mångsidigt genom att du kan försöka gå från en typ till någon annan.

Grundläggande användning

Ring metoden på objektet du vill konvertera och astype() kommer att försöka konvertera det åt dig:

Lägg märke till att jag sa ”försök” – om astype() inte vet hur man konverterar ett värde i serien eller DataFrame, kommer det att leda till ett fel. Om du till exempel har ettNaN ellerinf – värde får du ett fel som försöker konvertera det till ett heltal.

Från och med pandor 0, 20.,0, detta fel kan undertryckas genom att skicka errors='ignore'. Ditt ursprungliga objekt kommer att returneras orörd.

var försiktig

astype() är kraftfull, men det kommer ibland att konvertera värden ”felaktigt”. Till exempel:

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

det här är små heltal, så vad sägs om att konvertera till en osignerad 8-bitarstyp för att spara minne?

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

konverteringen fungerade, men -7 lindades runt för att bli 249 (dvs. 28 – 7)!

Om du försöker ladda ner medpd.to_numeric(s, downcast='unsigned') istället kan det hjälpa till att förhindra detta fel.,

infer_objects ()

version 0.21.0 av pandor introducerade metodeninfer_objects() för att konvertera kolumner i en dataram som har en objektdatatyp till en mer specifik typ (mjuka konverteringar).

här är till exempel en dataram med två kolumner av objekttyp. Den ena innehåller faktiska heltal och den andra innehåller strängar som representerar heltal:

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

med infer_objects() kan du ändra typen av kolumn ’A’ till int64:

>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object

kolumnen ’B’ har lämnats ensam sedan dess värden var strängar, inte heltal., Om du ville försöka tvinga omvandlingen av båda kolumnerna till ett heltalstyp kan du istället använda df.astype(int).

convert_dtypes ()

version 1.0 och senare innehåller en metodconvert_dtypes() för att konvertera serier och dataframe kolumner till bästa möjliga dtype som stöderpd.NA saknade värde.

här betyder” bästa möjliga ” den typ som passar bäst för att hålla värdena., Till exempel, detta en pandas heltalstyp om alla värden är heltal (eller saknade värden): ett objekt kolumn av Python heltal objekt konverteras till Int64, en kolumn av NumPy int32 värden kommer att bli pandas dtype Int32.,

med vårobject DataFramedf får vi följande resultat:

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

eftersom kolumnen”a”heltalsvärden konverterades den till typenInt64 (som kan hålla saknade värden, till skillnad frånint64).

kolumnen ’b’ innehöll strängobjekt, så ändrades till pandas’string dtype.

som standard kommer denna metod att dra slutsatsen typen från objektvärden i varje kolumn., Vi kan ändra detta genom att skicka infer_objects=False:

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

kolumnen”A”var en objektkolumn: pandas vet att den kan beskrivas som en ”heltal” – kolumn (internt sprang den infer_dtype) men drog inte exakt vad dtype av heltal den borde ha så inte konvertera den. Kolumnen ” b ”konverterades igen till ”string” dtype eftersom den erkändes som ”string” – värden.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *