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 float32
lub 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”.