Python Pandas - отсутствующие данные
Отсутствие данных всегда является проблемой в сценариях реальной жизни. Такие области, как машинное обучение и интеллектуальный анализ данных, сталкиваются с серьезными проблемами с точностью прогнозов их моделей из-за низкого качества данных, вызванного отсутствием значений. В этих областях обработка пропущенных значений является основным направлением, чтобы сделать их модели более точными и достоверными.
Когда и почему данные отсутствуют?
Давайте рассмотрим онлайн-опрос по продукту. Часто люди не делятся всей связанной с ними информацией. Мало кто делится своим опытом, но не тем, как долго они пользуются продуктом; немногие люди рассказывают, как долго они используют продукт, своим опытом, но не своей контактной информацией. Таким образом, так или иначе часть данных всегда отсутствует, и это очень часто бывает в реальном времени.
Давайте теперь посмотрим, как мы можем обрабатывать отсутствующие значения (скажем, NA или NaN) с помощью Pandas.
# 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
это output выглядит следующим образом -
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
Используя переиндексирование, мы создали DataFrame с пропущенными значениями. На выходеNaN средства Not a Number.
Проверьте отсутствующие значения
Чтобы упростить обнаружение отсутствующих значений (и для разных типов массивов), Pandas предоставляет isnull() и notnull() функции, которые также являются методами для объектов Series и DataFrame -
Пример 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()
это output выглядит следующим образом -
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
Пример 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()
это output выглядит следующим образом -
a True
b False
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
Расчеты с отсутствующими данными
- При суммировании данных NA будет рассматриваться как ноль.
- Если все данные NA, то результатом будет NA.
Пример 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()
это output выглядит следующим образом -
2.02357685917
Пример 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()
это output выглядит следующим образом -
nan
Очистка / заполнение недостающих данных
Pandas предоставляет различные методы для очистки недостающих значений. Функция fillna может «заполнять» значения NA ненулевыми данными двумя способами, которые мы проиллюстрировали в следующих разделах.
Заменить NaN скалярным значением
Следующая программа показывает, как можно заменить «NaN» на «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)
это output выглядит следующим образом -
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
Здесь мы заполняем нулевым значением; вместо этого мы также можем заполнить любое другое значение.
Заполнить NA вперед и назад
Используя концепции заполнения, обсуждаемые в главе «Переиндексирование», мы заполним недостающие значения.
Старший Нет | Метод и действие |
---|---|
1 | pad/fill Методы заливки Вперед |
2 | bfill/backfill Методы заливки Назад |
Пример 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')
это output выглядит следующим образом -
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
Пример 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')
это output выглядит следующим образом -
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
Отбросьте отсутствующие значения
Если вы хотите просто исключить отсутствующие значения, используйте dropna функции вместе с axisаргумент. По умолчанию ось = 0, т. Е. Вдоль строки, что означает, что если какое-либо значение в строке является NA, то вся строка исключается.
Пример 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()
это output выглядит следующим образом -
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
Пример 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)
это output выглядит следующим образом -
Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]
Заменить отсутствующие (или) общие значения
Часто нам приходится заменять общее значение некоторым конкретным значением. Мы можем добиться этого, применив метод замены.
Замена NA на скалярное значение эквивалентно поведению fillna() функция.
Пример 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})
это output выглядит следующим образом -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
Пример 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})
это output выглядит следующим образом -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60