English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Утерянные данные Pandas

Пример операции по потере данных в pandas

В реальной жизни проблема потери данных всегда существует. В областях, таких как машинное обучение и данные挖掘, сталкиваются с серьезными проблемами в точности предсказаний моделей, так как пропущенные значения приводят к снижению качества данных. В этих областях обработка пропущенных значений является основной задачей для повышения точности и эффективности моделей.

Когда и почему теряются данные?

Давайте рассмотрим онлайн-опрос продукта. Часто люди не делятся всей информацией, связанной с ними. Некоторым трудно делиться своим опытом, но они не делятся тем, как долго они используют этот продукт; некоторые делятся своим опытом использования продукта, а не своими контактными данными. Таким образом, всегда теряется часть данных, что очень распространено в реальном времени.
Давайте посмотрим, как использовать pandas для обработки пропущенных значений (например, NA или NaN).

# импорт библиотеки pandas
 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        two     three
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c 0.744328 -1.735166 1.749580
NaN заменено на '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

Используя перераспределение индексов, мы создали DataFrame с пропущенными значениями. В выходе NaN означает, что это не число.

Проверка пропущенных значений

Чтобы сделать обнаружение пропущенных значений легче (и для различных dtypes массивов), 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())

Результат выполнения приведен ниже:

 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())

Результат выполнения приведен ниже:

 a  True
 b  False
 c  True
 d  False
 e  True
 f  True
 g  False
 h  True
 Name: one, dtype: bool

Вычисление данных с пропущенными значениями

При агрегации данных 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())

Результат выполнения приведен ниже:

   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())

Результат выполнения приведен ниже:

   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',
 '])
 df = df.reindex(['a', 'b', 'c']))
 print(df)
 print(("NaN заменено на '0':"))
 print(df.fillna(0))

Результат выполнения приведен ниже:

       one        two     three
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c 0.744328 -1.735166 1.749580
NaN заменено на '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 вперед и назад

Используя концепцию заполнения, обсуждаемую в разделе «Перенумерация индексов», мы заполним отсутствующие значения.

МетодОперация
pad/fillЗаполнение значений перед
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'))

Результат выполнения приведен ниже:

       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'))

Результат выполнения приведен ниже:

       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. По умолчанию, 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())

Результат выполнения приведен ниже:

  
   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)),

Результат выполнения приведен ниже:

 Пустой DataFrame
 Столбцы: []
 Индекс: [a, b, c, d, e, f, g, h]

Замена отсутствующих (или) общих значений

Часто нам необходимо заменить общее значение на определенное значение. Это можно сделать с помощью метода replace.
В很多 случаях, нам нужно заменить общее значение на определенное значение. Это можно сделать с помощью метода replace.

Ин实例 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})),

Результат выполнения приведен ниже:

   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})),

Результат выполнения приведен ниже:

   one two
 0 10 10
 1 20 0
 2 30 30
 3 40 40
 4 50 50
 5 60 60