Dzwoniąc
df = pd.read_csv('somefile.csv')
Dostaję:
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: Kolumny (4,5,7,16) mają różne typy. Podaj opcję dtype podczas importu lub ustaw low_memory = False.
Dlaczego dtype
opcja jest powiązana low_memory
i dlaczego miałaby False
pomóc w rozwiązaniu tego problemu?
Odpowiedzi:
Przestarzała opcja low_memory
low_memory
Opcja nie jest prawidłowo przestarzałe, ale powinno być, ponieważ w rzeczywistości nie robić nic inaczej [ źródło ]Powodem, dla którego
low_memory
pojawia się to ostrzeżenie, jest to, że zgadywanie typów dla każdej kolumny jest bardzo wymagające pod względem pamięci. Pandas próbuje ustalić, który typ należy ustawić, analizując dane w każdej kolumnie.Dtype Guessing (bardzo źle)
Pandy mogą określić, jaki typ powinien mieć kolumna po odczytaniu całego pliku. Oznacza to, że tak naprawdę nic nie można przeanalizować przed odczytaniem całego pliku, chyba że ryzykujesz koniecznością zmiany typu tej kolumny podczas czytania ostatniej wartości.
Rozważ przykład jednego pliku, który ma kolumnę o nazwie user_id. Zawiera 10 milionów wierszy, w których identyfikator_użytkownika to zawsze liczby. Ponieważ pandy nie mogą wiedzieć, że to tylko liczby, prawdopodobnie zachowa je jako oryginalne ciągi znaków, dopóki nie przeczyta całego pliku.
Określanie typów (zawsze należy to zrobić)
dodawanie
do
pd.read_csv()
połączenia uczyni pandy wiedzieć kiedy zaczyna odczytu pliku, że jest to tylko liczby całkowite.Warto również zauważyć, że jeśli ostatni wiersz w pliku zostałby
"foobar"
zapisany wuser_id
kolumnie, ładowanie zawiesiłoby się, gdyby podano powyższy typ kodu.Przykład uszkodzonych danych, które psują się, gdy zdefiniowane są dtypy
dtypy są zwykle dziwaczne, przeczytaj o nich więcej tutaj: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Jakie istnieją typy?
Mamy dostęp do typów numpy: float, int, bool, timedelta64 [ns] i datetime64 [ns]. Zauważ, że typy liczbowe data / czas nie są zależne od strefy czasowej.
Pandy rozszerzają ten zestaw typów o własne:
„datetime64 [ns,]” Który jest znacznikiem czasu uwzględniającym strefę czasową.
„kategoria”, która jest zasadniczo wyliczeniem (ciągi znaków reprezentowane przez klucze całkowite do zapisania
„okres []” Nie należy mylić ich z timedelta, obiekty te są faktycznie zakotwiczone w określonych przedziałach czasowych
„Sparse”, „Sparse [int]”, „Sparse [float]” jest przeznaczony do rzadkich danych lub „danych z dużą ilością dziur” Zamiast zapisywać NaN lub None w ramce danych pomija obiekty, oszczędzając miejsce .
„Interwał” jest odrębnym tematem, ale jego głównym zastosowaniem jest indeksowanie. Zobacz więcej tutaj
„Int8”, „Int16”, „Int32”, „Int64”, „UInt8”, „UInt16”, „UInt32”, „UInt64” to liczby całkowite specyficzne dla pand, które można zerować, w przeciwieństwie do wariantu numpy.
„ciąg” jest specyficznym typem do pracy z danymi ciąg i zapewnia dostęp do
.str
atrybutu w serii.„boolean” jest jak numpy „bool”, ale obsługuje także brakujące dane.
Przeczytaj pełne odniesienie tutaj:
Odwołanie do typu pandy
Gotchas, zastrzeżenia, notatki
Ustawienie
dtype=object
wyciszy powyższe ostrzeżenie, ale nie sprawi, że będzie bardziej wydajna pamięć, tylko wydajne przetwarzanie.Ustawienie
dtype=unicode
nic nie zrobi, ponieważ dla numpy, aunicode
jest reprezentowane jakoobject
.Wykorzystanie konwerterów
@sparrow poprawnie wskazuje użycie konwerterów, aby uniknąć wysadzenia pand podczas spotkania
'foobar'
w kolumnie określonej jakoint
. Chciałbym dodać, że konwertery są naprawdę ciężkie i nieefektywne w użyciu w pandach i powinny być używane w ostateczności. Wynika to z faktu, że proces read_csv jest procesem pojedynczym.Pliki CSV mogą być przetwarzane wiersz po wierszu, a tym samym mogą być przetwarzane przez wiele konwerterów równolegle bardziej wydajnie, po prostu dzieląc plik na segmenty i uruchamiając wiele procesów, czego nie obsługuje panda. Ale to inna historia.
źródło
dtype=object
nie jest bardziej wydajne pod względem pamięci, czy jest jakiś powód, aby z nim zadzierać, oprócz pozbycia się błędu?error_bad_lines=False, warn_bad_lines=True
powinien załatwić sprawę. Dokumentacja mówi, że jest ważna tylko z parserem C. Mówi także, że domyślnym parserem jest Brak, co utrudnia ustalenie, który z nich jest domyślny.nrows=100
jako argument, a następnie zrobić,df.dtypes
aby zobaczyć otrzymane typy. Jednak podczas odczytywania całej ramki danych z tymi typami, pamiętaj, aby zrobić to,try/except
aby złapać błędne domysły typu. Wiesz, że dane są brudne.Próbować:
Zgodnie z dokumentacją pand:
Jeśli chodzi o low_memory, jest to domyślnie Prawda i nie jest jeszcze udokumentowane. Nie sądzę jednak, żeby było to istotne. Komunikat o błędzie jest ogólny, więc i tak nie powinieneś zadzierać z low_memory. Mam nadzieję, że to pomoże i daj mi znać, jeśli masz dalsze problemy
źródło
dtype=unicode
wyprodukowane:NameError: name 'unicode' is not defined
. Ale wstawianieunicode
cudzysłowów (jak w „Unicode”) wydaje się działać!numpy.dtype('unicode')
. Gdy podasz ciągowi dtype ciąg,numpy.dtype()
domyślnie spróbuje on rzucić go przez fabrykę. Określenie'unicode'
nic nie da, nic nie znacząobjects
. Dostanieszdtype='object'
To powinno rozwiązać problem. Otrzymałem dokładnie ten sam błąd, gdy czytam 1,8 mln wierszy z pliku CSV.
źródło
Jak wspomniano wcześniej przez firelynx, jeśli wyraźnie określono typ dtype i istnieją mieszane dane, które nie są zgodne z tym typem, ładowanie się zawiesi. Użyłem takiego konwertera jako obejścia, aby zmienić wartości z niezgodnym typem danych, aby dane mogły być nadal ładowane.
źródło
Miałem podobny problem z plikiem ~ 400 MB. Ustawienie
low_memory=False
załatwiło sprawę dla mnie. Najpierw wykonaj proste czynności: sprawdzę, czy twoja ramka danych nie jest większa niż pamięć systemowa, uruchom ponownie, wyczyść pamięć RAM przed kontynuowaniem. Jeśli nadal występują błędy, warto upewnić się, że.csv
plik jest w porządku, rzuć okiem na program Excel i upewnij się, że nie ma widocznego uszkodzenia. Zepsute oryginalne dane mogą siać spustoszenie ...źródło
Miałem podobny problem podczas przetwarzania ogromnego pliku csv (6 milionów wierszy). Miałem trzy problemy: 1. plik zawierał dziwne znaki (naprawione za pomocą kodowania) 2. typ danych nie został określony (naprawiony za pomocą właściwości dtype) 3. Korzystając z powyższego nadal napotykałem problem związany z formatem pliku, który nie mógł być zdefiniowane na podstawie nazwy pliku (naprawione przy pomocy try .. oprócz ...)
źródło
To działało dla mnie
low_memory = False
podczas importowania DataFrame. To wszystko, co działało dla mnie:źródło