Czytam dane z pliku .csv do ramki danych Pandas, jak poniżej. W przypadku jednej z kolumn id
chcę określić typ kolumny jako int
. Problem polega na tym, że id
seria ma brakujące / puste wartości.
Kiedy próbuję rzutować id
kolumnę na liczbę całkowitą podczas czytania pliku .csv, otrzymuję:
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
Ewentualnie próbowałem przekonwertować typ kolumny po przeczytaniu jak poniżej, ale tym razem otrzymuję:
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
Jak sobie z tym poradzić?
Odpowiedzi:
Brak powtórzeń NaN w kolumnach z liczbami całkowitymi to „łapacz” pandy .
Typowym obejściem jest po prostu użycie pływaków.
źródło
df = df.astype(pd.Int32Dtype())
(przekonwertować całą ramkę dataFrame lub)df['col'] = df['col'].astype(pd.Int32Dtype())
. Inne akceptowane typy liczb całkowitych dopuszczających wartość null topd.Int16Dtype
ipd.Int64Dtype
. Wybierz swoją truciznę.W wersji 0.24. + Pandy zyskały możliwość przechowywania liczb całkowitych z brakami danych.
Typ danych typu Nullable Integer .
Pandy mogą reprezentować dane całkowite z prawdopodobnie brakującymi wartościami przy użyciu
arrays.IntegerArray
. To typy rozszerzeń zaimplementowane w pandach. Nie jest to domyślny typ dtype dla liczb całkowitych i nie zostanie on wywnioskowany; musisz jawnie przekazać dtype doarray()
lubSeries
:Aby przekonwertować kolumnę na liczby całkowite dopuszczające wartość null, użyj:
źródło
"Int64"
a nie"int64"
(pierwsze „i” musi być pisane wielką literą)df.myCol = df.myCol.astype('Int64')
lubdf['myCol'] = df['myCol'].astype('Int64')
Mój przypadek użycia polega na łączeniu danych przed załadowaniem do tabeli bazy danych:
Usuń NaN, przekonwertuj na int, przekonwertuj na str, a następnie ponownie włóż NAN.
Nie jest ładna, ale spełnia swoje zadanie!
źródło
Teraz można utworzyć kolumnę pandy zawierającą NaN jako dtype
int
, ponieważ jest ona teraz oficjalnie dodawana na pandach 0.24.0pandas 0.24.x - informacje o wydaniu Cytat: „ Pandy zyskały zdolność do przechowywania liczb całkowitych z brakującymi wartościami
źródło
Jeśli absolutnie chcesz połączyć liczby całkowite i NaN w kolumnie, możesz użyć typu danych „obiekt”:
Spowoduje to zastąpienie NaN liczbą całkowitą (nie ma znaczenia która), konwersję na int, konwersję na obiekt i na końcu ponowne wstawienie NaN.
źródło
Jeśli możesz zmodyfikować zapisane dane, użyj wartości wartowniczej dla brakujących danych
id
. Typowy przypadek użycia, wywodzący się z nazwy kolumny, będącyid
liczbą całkowitą, ściśle większą od zera, można użyć0
jako wartości wartowniczej, aby można było pisaćźródło
Możesz użyć,
.dropna()
jeśli możesz usunąć wiersze z wartościami NaN.Alternatywnie użyj
.fillna()
i.astype()
aby zastąpić NaN wartościami i przekonwertować je na int.Napotkałem ten problem podczas przetwarzania pliku CSV z dużymi liczbami całkowitymi, podczas gdy niektórych z nich brakowało (NaN). Używanie typu float nie wchodziło w grę, ponieważ mógłbym stracić precyzję.
Moim rozwiązaniem było użycie str jako typu pośredniego . Następnie możesz przekonwertować ciąg na int, jak chcesz później w kodzie. Zastąpiłem NaN 0, ale możesz wybrać dowolną wartość.
Dla ilustracji, oto przykład, w jaki sposób zmiennoprzecinkowe mogą stracić precyzję:
A wynik to:
źródło
Większość rozwiązań tutaj mówi, jak używać zastępczej liczby całkowitej do reprezentowania wartości null. Takie podejście nie jest pomocne, jeśli nie masz pewności, że liczba całkowita nie pojawi się w danych źródłowych. Moja metoda z formatuje zmiennoprzecinkowe bez ich wartości dziesiętnych i konwertuje wartości null na brak. Wynikiem jest obiektowy typ danych, który po załadowaniu do pliku CSV będzie wyglądał jak pole typu integer z wartościami null.
źródło
Napotkałem ten problem podczas pracy z pyspark. Ponieważ jest to nakładka na język Pythona dla kodu działającego w jvm, wymaga bezpieczeństwa typów, a używanie float zamiast int nie jest opcją. Rozwiązałem ten problem, opakowując pandy
pd.read_csv
w funkcję, która wypełni kolumny zdefiniowane przez użytkownika wartościami wypełnienia zdefiniowanymi przez użytkownika przed rzutowaniem ich na wymagany typ. Oto, czego ostatecznie użyłem:źródło
źródło
edit
dodać dodatkowe informacje i / lub uzupełnić swoje wyjaśnienia o dokumentację źródłową.Najpierw usuń wiersze zawierające NaN. Następnie wykonaj konwersję liczb całkowitych w pozostałych wierszach. W końcu wstaw ponownie usunięte wiersze. Mam nadzieję, że to zadziała
źródło
Zakładając, że kolumna DateColumn sformatowana 3312018.0 powinna zostać przekonwertowana na 31.03.2018 jako ciąg. Brakuje niektórych rekordów lub 0.
źródło