Mam ramkę danych, jak poniżej
itm Date Amount
67 420 2012-09-30 00:00:00 65211
68 421 2012-09-09 00:00:00 29424
69 421 2012-09-16 00:00:00 29877
70 421 2012-09-23 00:00:00 30990
71 421 2012-09-30 00:00:00 61303
72 485 2012-09-09 00:00:00 71781
73 485 2012-09-16 00:00:00 NaN
74 485 2012-09-23 00:00:00 11072
75 485 2012-09-30 00:00:00 113702
76 489 2012-09-09 00:00:00 64731
77 489 2012-09-16 00:00:00 NaN
przy próbie zastosowania funkcji do kolumny Kwota pojawia się następujący błąd.
ValueError: cannot convert float NaN to integer
Próbowałem zastosować funkcję przy użyciu .isnan z modułu matematycznego. Próbowałem atrybutu pandy .replace Próbowałem atrybutu danych rzadkich z pand 0.9 Próbowałem także, jeśli NaN == NaN instrukcja w funkcji. Przejrzałem także ten artykuł Jak zastąpić wartości NA zerami w ramce danych R. patrząc na inne artykuły. Wszystkie metody, które wypróbowałem, nie zadziałały lub nie rozpoznają NaN. Wszelkie wskazówki i rozwiązania będą mile widziane.
Odpowiedzi:
Wierzę,
DataFrame.fillna()
że zrobi to za ciebie.Link do Dokumentów dla ramki danych i serii .
Przykład:
Aby wypełnić NaN tylko w jednej kolumnie, wybierz tylko tę kolumnę. w tym przypadku używam inplace = True, aby faktycznie zmienić zawartość df.
EDYTOWAĆ:
Aby tego uniknąć
SettingWithCopyWarning
, użyj wbudowanej funkcji specyficznej dla kolumny:źródło
df[1]
jest to widok, a nie kopia oryginalnego pliku DF? Oczywiście, jeśli występuje rzadka sytuacja, w której jest to kopia, spowodowałoby to bardzo kłopotliwy błąd. Czy w dokumentacji pand istnieje wyraźne stwierdzenie?Nie ma gwarancji, że krojenie zwróci widok lub kopię. Możesz to zrobić
źródło
Możesz użyć,
replace
aby zmienićNaN
na0
:źródło
NaN
? czy zastąpi również wartość gdzieNA
lubNaN
jakdf.fillna(0)
? Szukam rozwiązania, które zastąpi wartość tylko tam, gdzie jest,NaN
a nieNA
NaN
tj. Wartości, gdzienp.isnan
jest prawdaChciałem tylko przedstawić trochę aktualizacji / specjalnego przypadku, ponieważ wygląda na to, że ludzie nadal tu przychodzą. Jeśli używasz indeksu wielokrotnego lub w inny sposób używasz fragmentatora indeksu, opcja inplace = True może nie wystarczyć do zaktualizowania wybranego wycinka. Na przykład w indeksie wielopoziomowym 2x2 nie zmieni to żadnych wartości (od pand 0,15):
„Problem” polega na tym, że tworzenie łańcuchów przerywa zdolność fillna do aktualizacji oryginalnej ramki danych. Umieszczam „problem” w cudzysłowie, ponieważ istnieją dobre powody dla decyzji projektowych, które doprowadziły do braku interpretacji przez te łańcuchy w niektórych sytuacjach. Jest to również złożony przykład (choć naprawdę na niego wpadłem), ale to samo może dotyczyć mniejszej liczby indeksów w zależności od tego, jak pokroisz.
Rozwiązaniem jest DataFrame.update:
Jest to jedna linia, czyta się dość dobrze (w pewnym sensie) i eliminuje niepotrzebne problemy z pośrednimi zmiennymi lub pętlami, jednocześnie umożliwiając zastosowanie wypełnienia do dowolnego wielopoziomowego plasterka, który lubisz!
Jeśli ktokolwiek może znaleźć miejsca, które nie działają, proszę zamieścić w komentarzach, bałagałem się i patrzę na źródło i wydaje się, że to rozwiązało przynajmniej moje problemy z wycinaniem wielu indeksów.
źródło
Poniższy kod działał dla mnie.
źródło
Łatwy sposób uzupełnienia brakujących wartości: -
wypełnianie kolumn ciągów: gdy w kolumnach ciągów brakuje wartości i wartości NaN.
wypełnianie kolumn numerycznych: gdy w kolumnach numerycznych brakuje wartości i NaN.
wypełnienie NaN zerą:
źródło
Można także użyć słowników do wypełnienia wartości NaN określonych kolumn w ramce danych, a zamiast wszystkich wartości DF z jakąś wartością oneValue.
źródło
Biorąc pod uwagę konkretną kolumnę
Amount
w powyższej tabeli, jest ona liczbą całkowitą. Rozwiązaniem byłoby:Podobnie możesz wypełnić go różnymi typami danych, takimi jak
float
,str
i tak dalej.W szczególności rozważę typ danych, aby porównać różne wartości tej samej kolumny.
źródło
Aby zastąpić wartości na w pandach
jeśli
inplace = False
zamiast zaktualizować df (ramkę danych), zwróci zmodyfikowane wartości.źródło
Jeśli chcesz przekonwertować go na ramkę danych pandy, możesz to również zrobić za pomocą
fillna
.Zwróci to:
źródło
Dostępne są przede wszystkim dwie opcje; w przypadku przypisania lub uzupełnienia brakujących wartości NaN / np.nan tylko z numerycznymi zamiennikami (w różnych kolumnach:
df['Amount'].fillna(value=None, method= ,axis=1,)
jest wystarczający:Z dokumentacji:
wartość: wartość skalarna, dict, Series lub DataFrame do użycia do wypełniania otworów (np. 0), alternatywnie dict / Series / DataFrame z wartościami określającymi, która wartość ma być użyta dla każdego indeksu (dla serii) lub kolumny (dla DataFrame) . (wartości nie zawarte w dict / Series / DataFrame nie zostaną wypełnione). Ta wartość nie może być listą.
Co oznacza, że „ciągi” lub „stałe” nie mogą już być przypisywane.
Aby użyć bardziej specjalistycznych kalkulacji SimpleImputer () :
źródło
Aby zastąpić nan w różnych kolumnach na różne sposoby:
źródło