Python - czyszczenie danych
Brakujące dane są zawsze problemem w rzeczywistych scenariuszach. Obszary takie jak uczenie maszynowe i eksploracja danych borykają się z poważnymi problemami z dokładnością prognoz modelu z powodu niskiej jakości danych spowodowanej brakującymi wartościami. W tych obszarach traktowanie brakujących wartości jest głównym punktem zainteresowania, aby ich modele były dokładniejsze i bardziej aktualne.
Kiedy i dlaczego brakuje danych?
Rozważmy ankietę internetową dotyczącą produktu. Często ludzie nie udostępniają wszystkich związanych z nimi informacji. Niewiele osób dzieli się swoimi doświadczeniami, ale nie dotyczy to tego, jak długo używają produktu; niewiele osób dzieli się tym, jak długo używają produktu, swoimi doświadczeniami, ale nie podaje informacji kontaktowych. W ten sposób zawsze brakuje części danych, co jest bardzo powszechne w czasie rzeczywistym.
Zobaczmy teraz, jak możemy obsłużyć brakujące wartości (powiedzmy NA lub NaN) za pomocą Pand.
# import the pandas library
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
b NaN NaN NaN
c -0.390208 -0.551605 -2.301950
d NaN NaN NaN
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g NaN NaN NaN
h 0.085100 0.532791 0.887415
Korzystając z reindeksowania, utworzyliśmy DataFrame z brakami danych. Na wyjściuNaN znaczy Not a Number.
Sprawdź brakujące wartości
Aby ułatwić wykrywanie brakujących wartości (i dla różnych typów tablic), Pandas udostępnia isnull() i notnull() funkcje, które są również metodami w obiektach Series i DataFrame -
Przykład
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].isnull()
Jego output wygląda następująco -
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
Czyszczenie / uzupełnianie brakujących danych
Pandy zapewnia różne metody czyszczenia brakujących wartości. Funkcja fillna może „wypełnić” wartości NA danymi niezerowymi na kilka sposobów, które zilustrowaliśmy w kolejnych sekcjach.
Zastąp NaN wartością skalarną
Poniższy program pokazuje, jak zamienić „NaN” na „0”.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print df
print ("NaN replaced with '0':")
print df.fillna(0)
Jego output wygląda następująco -
one two three
a -0.576991 -0.741695 0.553172
b NaN NaN NaN
c 0.744328 -1.735166 1.749580
NaN replaced with '0':
one two three
a -0.576991 -0.741695 0.553172
b 0.000000 0.000000 0.000000
c 0.744328 -1.735166 1.749580
Tutaj wypełniamy wartością zero; zamiast tego możemy również wypełnić dowolną inną wartością.
Wypełnij NA do przodu i do tyłu
Wykorzystując koncepcje wypełniania omówione w rozdziale o indeksowaniu, uzupełnimy brakujące wartości.
metoda | Akcja |
---|---|
wypełnienie / wypełnienie | Metody wypełnienia Forward |
bfill / backfill | Metody wypełniania Wstecz |
Przykład
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='pad')
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
b 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
d -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Usuń brakujące wartości
Jeśli chcesz po prostu wykluczyć brakujące wartości, użyj dropna funkcja wraz z axisargument. Domyślnie oś = 0, tj. Wzdłuż wiersza, co oznacza, że jeśli jakakolwiek wartość w wierszu ma wartość NA, cały wiersz jest wykluczony.
Przykład
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Zastąp brakujące (lub) wartości ogólne
Często musimy zastąpić wartość ogólną jakąś określoną wartością. Możemy to osiągnąć stosując metodę zamiany.
Zastąpienie NA wartością skalarną jest równoważnym zachowaniem fillna() funkcjonować.
Przykład
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000],
'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
Jego output wygląda następująco -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60