Przed przystąpieniem do tego postu ważne jest, aby zrozumieć różnicę między NaN i None . Jeden to typ zmiennoprzecinkowy, drugi to typ obiektowy. Pandy lepiej nadają się do pracy z typami skalarnymi, ponieważ wiele metod na tych typach można wektoryzować. Pandy próbują obsłużyć konsekwentnie None i NaN, ale NumPy nie może.
Moja sugestia ( i Andy'ego ) to trzymać się NaN.
Ale żeby odpowiedzieć na twoje pytanie ...
pandy> = 0.18: użyj na_values=['-']
argumentu zread_csv
Jeśli załadowałeś te dane z CSV / Excel, mam dla Ciebie dobrą wiadomość. Możesz wyłączyć to w katalogu głównym podczas ładowania danych, zamiast pisać poprawkę z kodem jako kolejny krok.
Większość pd.read_*
funkcji (takich jak read_csv
i read_excel
) przyjmuje na_values
atrybut.
file.csv
A,B
-,1
3,-
2,-
5,3
1,-2
-5,4
-1,-1
-,0
9,0
Teraz, aby przekonwertować -
znaki na NaN, zrób,
import pandas as pd
df = pd.read_csv('file.csv', na_values=['-'])
df
A B
0 NaN 1.0
1 3.0 NaN
2 2.0 NaN
3 5.0 3.0
4 1.0 -2.0
5 -5.0 4.0
6 -1.0 -1.0
7 NaN 0.0
8 9.0 0.0
I podobnie w przypadku innych funkcji / formatów plików.
PS: W wersji 0.24 + możesz zachować typ całkowity, nawet jeśli twoja kolumna ma NaN (tak, porozmawiaj o tym, że masz ciastko i jesz). Możesz określićdtype='Int32'
df = pd.read_csv('file.csv', na_values=['-'], dtype='Int32')
df
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
df.dtypes
A Int32
B Int32
dtype: object
Dtype nie jest konwencjonalnym typem int ... ale raczej typem Nullable Integer. Istnieją inne opcje.
Obsługa danych liczbowych: pd.to_numeric
zerrors='coerce
Jeśli masz do czynienia z danymi liczbowymi, szybszym rozwiązaniem jest skorzystanie pd.to_numeric
z errors='coerce'
argumentem, który wymusza nieprawidłowe wartości (wartości, które nie mogą być oddane do numerycznej) do Nan.
pd.to_numeric(df['A'], errors='coerce')
0 NaN
1 3.0
2 2.0
3 5.0
4 1.0
5 -5.0
6 -1.0
7 NaN
8 9.0
Name: A, dtype: float64
Aby zachować wartość całkowitą dtype (dopuszcza wartość null), użyj
pd.to_numeric(df['A'], errors='coerce').astype('Int32')
0 NaN
1 3
2 2
3 5
4 1
5 -5
6 -1
7 NaN
8 9
Name: A, dtype: Int32
Aby wymusić wiele kolumn, użyj apply
:
df[['A', 'B']].apply(pd.to_numeric, errors='coerce').astype('Int32')
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
... i przypisz wynik z powrotem po.
Więcej informacji można znaleźć w tej odpowiedzi .
write_frame
nie parsujeNaN
s donone
s?