Zmień typ kolumny w pandach

masz cztery główne opcje konwersji typów w pandach:

Czytaj dalej, aby uzyskać bardziej szczegółowe wyjaśnienia i użycie każdej z tych metod.

najlepszym sposobem konwersji jednej lub więcej kolumn ramki danych na wartości liczbowe jest użyciepandas.to_numeric().

Ta funkcja spróbuje zmienić obiekty nieliczbowe (takie jak łańcuchy znaków) na liczby całkowite lub liczby zmiennoprzecinkowe.

podstawowe użycie

Wejście doto_numeric() jest serią lub pojedynczą kolumną ramki danych.,

jak widać zwracana jest nowa seria. Pamiętaj, aby przypisać to wyjście do zmiennej lub nazwy kolumny, aby kontynuować korzystanie z niego:

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

Możesz również użyć go do konwersji wielu kolumn ramki danych za pomocą apply() metoda:

tak długo, jak wszystkie wartości mogą być przekonwertowane, to prawdopodobnie wszystko, czego potrzebujesz.

obsługa błędów

ale co, jeśli niektórych wartości nie można przekonwertować na typ liczbowy?,

to_numeric() pobiera również argument słowa kluczowegoerrors, który pozwala wymusić wartości nieliczbowe naNaN lub po prostu ignorować kolumny zawierające te wartości.

oto przykład użycia serii łańcuchów s, które mają obiekt dtype:

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

domyślnym zachowaniem jest podniesienie, jeśli nie może przekonwertować wartości., W tym przypadku, nie może poradzić sobie z ciągiem 'pandas':

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

zamiast niepowodzenia, możemy chcieć, aby' pandas ' był uważany za brakującą/złą wartość liczbową., Możemy zmusić nieprawidłowe wartości do NaN w następujący sposób używając errors argument słowa kluczowego:

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

trzecia opcja dla errors jest po prostu ignorować operację, jeśli Nieprawidłowa wartość występuje:

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

ta ostatnia opcja jest szczególnie przydatna, gdy chcesz przekonwertować całą ramkę danych, ale nie wiesz, które z naszych kolumn można przekonwertować niezawodnie na typ numeryczny., W takim przypadku wystarczy napisać:

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

funkcja zostanie zastosowana do każdej kolumny ramki danych. Kolumny, które mogą być przekonwertowane na typ numeryczny, zostaną przekonwertowane, podczas gdy kolumny, które nie mogą (np. zawierają niecyfrowe ciągi znaków lub daty) zostaną pozostawione same.

Downcasting

domyślnie konwersja zto_numeric() daje alboint64 lubfloat64 dtype (lub dowolna szerokość Całkowita jest natywna dla Twojej platformy).,

zazwyczaj tego chcesz, ale co, jeśli chcesz zapisać trochę pamięci i użyć bardziej kompaktowego typu dtype, takiego jak float32lub int8?

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

Downcasting do 'integer' używa najmniejszej możliwej liczby całkowitej, która może pomieścić wartości:

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

Downcasting do 'float' podobnie wybiera mniejszy niż normalny typ pływający:

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

astype()

metoda astype() pozwala na jednoznaczne określenie typu dtype, który ma mieć ramka danych lub seria., Jest bardzo wszechstronny, ponieważ można próbować przejść od jednego typu do dowolnego innego.

podstawowe użycie

wywołanie metody na obiekcie, który chcesz przekonwertować iastype() spróbuje ją przekonwertować za Ciebie:

zauważ, że powiedziałem „try” – jeśliastype() nie wie, jak przekonwertować wartość z serii lub ramki danych, spowoduje to błąd. Na przykład, jeśli masz wartość NaN lub inf, pojawi się błąd podczas próby przekonwertowania jej na liczbę całkowitą.

od 0.20.,0, ten błąd można stłumić przekazując errors='ignore'. Twój oryginalny przedmiot zostanie zwrócony nietknięty.

bądź ostrożny

astype() jest potężny, ale czasami konwertuje wartości „niepoprawnie”. Na przykład:

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

są to małe liczby całkowite, więc co powiesz na konwersję do niepodpisanego 8-bitowego typu, aby zapisać pamięć?

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

konwersja zadziałała, ale -7 było owinięte okrągłe do 249 (tj. 28 – 7)!

próba downcast za pomocąpd.to_numeric(s, downcast='unsigned') zamiast tego może pomóc zapobiec temu błędowi.,

infer_objects()

wersja 0.21.0 pandas wprowadziła metodę infer_objects() do konwersji kolumn ramki danych, które mają obiektowy typ danych na bardziej konkretny typ (miękkie konwersje).

na przykład, oto ramka danych z dwiema kolumnami typu object. Jedna przechowuje rzeczywiste liczby całkowite, a druga zawiera ciągi znaków reprezentujących liczby całkowite:

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

używając infer_objects(), możesz zmienić typ kolumny 'a' na int64:

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

Kolumna 'b' została pozostawiona sama, ponieważ jej wartości były ciągami, Nie liczby całkowite., Jeśli chcesz spróbować wymusić konwersję obu kolumn do typu integer, możesz zamiast tego użyć df.astype(int).

convert_dtypes ()

Wersja 1.0 i nowsza zawiera metodęconvert_dtypes() do konwersji kolumn serii i ramki danych na najlepszy możliwy Typ dtype, który obsługujepd.NA brakującej wartości.

tutaj „best possible” oznacza typ najbardziej odpowiedni do przechowywania wartości., Na przykład, ten typ pandas integer jeśli wszystkie wartości są liczbami całkowitymi( lub brakującymi wartościami): kolumna obiektu Pythona integer objects jest konwertowana na Int64, kolumna NumPy int32 wartości staną się dtype pandas Int32.,

z naszym object DataFrame df otrzymujemy następujący wynik:

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

ponieważ kolumna 'a' zawiera wartości całkowite, została przekonwertowana na Int64 typ (który jest zdolny do przechowywania brakujących wartości, w przeciwieństwie do int64).

Kolumna ' b 'zawierała obiekty typu string, więc została zmieniona na' string dtype.

domyślnie metoda ta wywnioskuje typ z wartości obiektu w każdej kolumnie., Możemy to zmienić przechodząc infer_objects=False:

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

teraz kolumna 'a' pozostała kolumną obiektu: pandy wie, że może być opisana jako kolumna 'integer' (wewnętrznie działała infer_dtype), ale nie wywnioskowała dokładnie, jaki dtype integer powinien mieć więc nie nawróciłem go. Kolumna ” b „została ponownie przekonwertowana na „string” dtype, ponieważ została uznana za posiadającą wartości „string”.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *