Python Pandas - brakujące dane
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 zapewnia isnull() i notnull() funkcje, które są również metodami w obiektach Series i DataFrame -
Przykład 1
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
Przykład 2
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'].notnull()
Jego output wygląda następująco -
a True
b False
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
Obliczenia z brakującymi danymi
- Podczas sumowania danych NA będzie traktowane jako zero
- Jeśli wszystkie dane to NA, wynikiem będzie NA
Przykład 1
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'].sum()
Jego output wygląda następująco -
2.02357685917
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()
Jego output wygląda następująco -
nan
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.
Sr.No | Metoda i działanie |
---|---|
1 | pad/fill Metody wypełnienia Forward |
2 | bfill/backfill Metody wypełniania Wstecz |
Przykład 1
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
Przykład 2
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='backfill')
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
b -0.390208 -0.551605 -2.301950
c -0.390208 -0.551605 -2.301950
d -2.000303 -0.788201 1.510072
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g 0.085100 0.532791 0.887415
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 1
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
Przykład 2
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(axis=1)
Jego output wygląda następująco -
Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]
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 1
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
Przykład 2
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