Czy istnieje preferowany sposób, aby zachować typ danych numpy
tablicy ustalony jako int
( int64
lub cokolwiek), jednocześnie mając wewnątrz element wymieniony jako numpy.NaN
?
W szczególności konwertuję wewnętrzną strukturę danych na Pandas DataFrame. W naszej strukturze mamy kolumny typu całkowitego, które nadal mają NaN (ale dtype kolumny to int). Wygląda na to, że jeśli zrobimy z tego DataFrame, wszystko przekształci się w float, ale naprawdę chcielibyśmy, aby tak było int
.
Myśli?
Próbowano:
Próbowałem użyć from_records()
funkcji pod pandas.DataFrame z coerce_float=False
i to nie pomogło. Próbowałem też użyć tablic maskowanych NumPy z NaN fill_value, co również nie działało. Wszystko to spowodowało, że typ danych kolumny stał się zmiennoprzecinkowy.
from_records
funkcję pod pandas.DataFrame,coerce_float=False
ale bez powodzenia ... nadal sprawia, że nowe dane mają typfloat64
.Odpowiedzi:
Ta możliwość została dodana do pand (począwszy od wersji 0.24): https://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support
W tym momencie wymaga użycia rozszerzenia dtype Int64 (pisane wielką literą) zamiast domyślnego dtype int64 (małe litery).
źródło
'Int64'
aby działał. Będzie jeszcze lepiej, gdy będzie domyślnie włączony.'Int64'
czy jest coś takiego'Int8'
? Zużywa szaloną ilość pamięci w porównaniu donp.float
.'Int8'
wydaje się działać, alenp.float
nadal wydaje się ładować znacznie szybciej. Wydaje się, że problem polega na tym, że nie zwalnia pamięci pomiędzy. Załóżmy, że odśmiecacz w końcu się uruchomi.NaN
nie można przechowywać w tablicy liczb całkowitych. Jest to obecnie znane ograniczenie pand; Czekałem na postęp z wartościami NA w NumPy (podobnie jak NA w R), ale minie co najmniej 6 miesięcy do roku, zanim NumPy uzyska te funkcje, wydaje się:http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
(Ta funkcja została dodana począwszy od wersji 0.24 pand, ale pamiętaj, że wymaga użycia rozszerzenia dtype Int64 (pisane wielkimi literami), zamiast domyślnego dtype int64 (małe litery): https://pandas.pydata.org/pandas- docs / version / 0.24 / whatsnew / v0.24.0.html # optional-integer-na-support )
źródło
Jeśli wydajność nie jest głównym problemem, możesz zamiast tego przechowywać ciągi.
Następnie możesz mieszać
NaN
tyle, ile chcesz. Jeśli naprawdę chcesz mieć liczby całkowite, w zależności od aplikacji, możesz użyć-1
, lub0
, lub1234567890
, lub innej dedykowanej wartości do reprezentacjiNaN
.Możesz także tymczasowo zduplikować kolumny: jedną taką, jaką masz, z pływakami; druga eksperymentalna, z intami lub stringami. Następnie wstawia
asserts
w każdym rozsądnym miejscu, sprawdzając, czy oba są zsynchronizowane. Po wystarczających testach możesz puścić pływaki.źródło
To nie jest rozwiązanie dla wszystkich przypadków, ale moje (współrzędne genomowe) uciekłem się do użycia 0 jako NaN
Pozwala to przynajmniej na użycie właściwego „natywnego” typu kolumny, operacje takie jak odejmowanie, porównywanie itp. Działają zgodnie z oczekiwaniami
źródło
Pandy v0.24 +
Funkcjonalność do obsługi
NaN
serii liczb całkowitych będzie dostępna od wersji 0.24 wzwyż. Nie ma informacji na ten temat w v0.24 „Co nowego” sekcji, a więcej szczegółów pod pustych Integer typ danych .Pandas v0.23 i starsze
Ogólnie rzecz biorąc, najlepiej jest pracować z
float
seriami, jeśli to możliwe, nawet jeśli seria jest nadawana odint
do zfloat
powodu uwzględnieniaNaN
wartości. Umożliwia to wektoryzację obliczeń opartych na NumPy, w których w przeciwnym razie byłyby przetwarzane pętle na poziomie Pythona.Dokumentacja sugeruje : „Jedną z możliwości jest użycie
dtype=object
zamiast tego tablic”. Na przykład:Ze względów kosmetycznych, np. Wyjście do pliku, może to być preferowane.
Pandy v0.23 i starsze: tło
NaN
jest uważany zafloat
. Dokumentacja obecnie (od wersji 0.23) określa powód, dla którego serie liczb całkowitych są aktualizowane dofloat
:Dokumenty zawierają również zasady upcastingu z powodu
NaN
włączenia:źródło
Jest to teraz możliwe, ponieważ pandas v 0.24.0
pandas 0.24.x informacje o wydaniu Cytat: „ Pandy zyskały zdolność przechowywania liczb całkowitych z brakami danych.
źródło
Chciałem tylko dodać, że w przypadku, gdy próbujesz przekonwertować wektor typu float (1.143) na liczbę całkowitą (1), która ma konwersję NA do nowego typu `` Int64 '', spowoduje to błąd. Aby rozwiązać ten problem, musisz zaokrąglić liczby, a następnie wykonać „.astype ('Int64')”
Mój przypadek użycia jest taki, że mam serię zmiennoprzecinkową, którą chcę zaokrąglić do int, ale kiedy wykonasz .round (), pozostanie '* .0' na końcu liczby, więc możesz upuścić to 0 z końca o konwersja na int.
źródło
Jeśli w danych tekstowych znajdują się spacje, kolumny, które normalnie byłyby liczbami całkowitymi, zostaną rzutowane na elementy zmiennoprzecinkowe jako float64 dtype, ponieważ int64 dtype nie obsługuje wartości null. Może to spowodować niespójny schemat, jeśli ładujesz wiele plików, niektóre z pustymi wartościami (które kończą się jako float64, a inne bez których kończą się jako int64
Ten kod podejmie próbę konwersji dowolnych kolumn typu liczbowego na Int64 (w przeciwieństwie do int64), ponieważ Int64 może obsługiwać wartości null
źródło