Chciałbym zamienić złe wartości w kolumnie ramki danych na wartości NaN.
mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)
df[df.y == 'N/A']['y'] = np.nan
Chociaż ostatnia linia zawodzi i generuje ostrzeżenie, ponieważ działa na kopii df. Więc jaki jest właściwy sposób radzenia sobie z tym? Widziałem wiele rozwiązań z iloc lub ix, ale tutaj muszę użyć warunku logicznego.
Odpowiedzi:
po prostu użyj
replace
:To, czego próbujesz, nazywa się indeksowaniem łańcuchowym: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
loc
Aby upewnić się, że pracujesz na oryginalnym dF, możesz użyć :źródło
Chociaż użycie
replace
wydaje się rozwiązywać problem, chciałbym zaproponować alternatywę. Problem z pomieszaniem wartości liczbowych i niektórych łańcuchów w kolumnie, aby nie zastępować łańcuchów np.nan, ale aby cała kolumna była poprawna. Założę się, że oryginalna kolumna jest najprawdopodobniej typu obiektowegoTo, czego naprawdę potrzebujesz, to uczynić ją kolumną numeryczną (będzie miała odpowiedni typ i byłaby znacznie szybsza), z wszystkimi wartościami nienumerycznymi zastąpionymi przez NaN.
Zatem dobry byłby kod konwersji
Określ,
errors='coerce'
aby wymusić na ciągach, których nie można przeanalizować na wartość liczbową, na NaN. Typ kolumny toźródło
Możesz użyć zamiany:
Pamiętaj również o
inplace
parametrze forreplace
. Możesz zrobić coś takiego:Spowoduje to zastąpienie wszystkich instancji w pliku df bez tworzenia kopii.
Podobnie, jeśli napotkasz inne typy nieznanych wartości, takie jak pusty ciąg lub wartość Brak:
Odniesienie: Najnowsze Pandy - Wymień
źródło
Od wersji pandas 1.0.0 nie musisz już używać numpy do tworzenia wartości null w ramce danych. Zamiast tego możesz po prostu użyć pandas.NA (który jest typu pandas._libs.missing.NAType), więc będzie traktowany jako pusty w ramce danych, ale nie będzie zerowy poza kontekstem ramki danych.
źródło
To rozwiąże twój problem. Z podwójnym [] pracujesz na kopii DataFrame. Musisz podać dokładną lokalizację w jednym wywołaniu, aby móc ją zmodyfikować.
źródło
Możesz spróbować tych fragmentów.
źródło
df.replace ('columnvalue', np.NaN, inplace = True)
źródło