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