Анализ данных — обработка пропущенных значений

анализ данных
Анализ данных — обработка пропущенных значений

Данные, которые мы получаем (особенно когда объем данных относительно велик), могут иметь проблемы, такие как отсутствующие данные и аномальные данные.Обработка данных является очень важной и необходимой частью анализа данных.Чтобы выполнить анализ данных как можно больше возможно Уменьшить возникновение аномалий и сделать более точные выводы анализа, поэтому обработка данных особенно необходима перед анализом данных

Условия чтения: знакомы с основными операциями панд
Используемые инструменты: Python

Используемая платформа: Jupyter Notebook

Обработка пропущенных значений

Отсутствие оценочного суждения

Python в основном читает данные csv или excel.Когда ячейка в excel пуста, pandas читает и отображает NaN, что является отсутствующим значением.

Методы оценки данных об отсутствующих значениях:нулевой, ненулевой

  • isnull: True означает отсутствие, False означает отсутствие
  • notnull: True означает отсутствие отсутствия, False означает отсутствие

Сначала импортируйте необходимый набор инструментов для анализа данных Python.

import numpy as np
import pandas as pd
__author__='莫叹'

Сгенерировать табличный двумерный массив df

#生成一个表格型的二维数组
df=pd.DataFrame({'a':[34,6,20,np.nan,56],
               'b':['juejin','number','one','good',np.nan]})

Результат выглядит следующим образом:


Определите, есть ли в данных пропущенные значения, и отфильтруйте непропущенные значения:

#判断二维数组df是否缺失
print(df.notnull(),'\n')
#通过索引判断a列是否缺失
print(df['a'].notnull(),'\n')
#筛选a列不存在缺失值数组
print(df[df['a'].notnull()])

Результат выглядит следующим образом:

       a      b
0   True   True
1   True   True
2   True   True
3  False   True
4   True  False 

0     True
1     True
2     True
3    False
4     True
Name: a, dtype: bool 

      a       b
0  34.0  juejin
1   6.0  number
2  20.0     one
4  56.0     NaN

Удаление пропущенного значения

Фильтрация по приведенному выше значению логической последовательности notnull также является методом удаления отсутствующего значения.

Удаление отсутствующих значений необходимо обрабатывать в соответствии с конкретными данными и условиями бизнеса.Иногда необходимо удалить все отсутствующие данные, иногда необходимо удалить часть отсутствующих данных, а иногда необходимо удалить только указанные отсутствующие данные. удален.

Метод удаления пропущенных значений: dropna(ось)

  • Параметр по умолчанию = 0, чтобы удалить данные строки, когда параметр оси = 1 удаляет данные столбца (но обычно не выбирает ось = 1, если это 1, он напрямую удаляет все переменные данные)
  • входящийкогда молот=nСохраняйте строки, содержащие не менее n данных, отличных от NaN.

#生成一个表格型二维数组
df2=pd.DataFrame([[1,2,3],['juejin',np.nan,np.nan],['a','b',np.nan],[np.nan,np.nan,np.nan],['d','j','h']],
                 columns=list('ABC'))
print(df2,'\n')
#删除所有存在缺失值的行
print(df2.dropna(),'\n')
#删除部分存在缺失值的行,保留至少有n个非NaN数据的行(比如保留至少有一个非NaN数据的行)
print(df2.dropna(thresh=1),'\n')
#删除某一列存在缺失值的行(删除A列里存在缺失值的所有的行,和上面的布尔值序列筛选相同)
print(df2[df2['A'].notnull()])

Результат выглядит следующим образом:

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3     NaN  NaN  NaN
4       d    j    h 

   A  B  C
0  1  2  3
4  d  j  h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
4       d    j    h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
4       d    j    h

Заполнение/замена отсутствующего значения

Метод заполнения: fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

  • параметр значения: значение заполнения
  • параметры метода: pad/ffill → заполнить предыдущими данными, backfill/bfill → заполнить более поздними данными

Метод замены: replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)

  • Параметр to_replacec: значение для замены
  • параметр значения: заменить значение

Примеры использования следующие:

import copy
df3=pd.DataFrame([[1,2,3],['juejin',np.nan,np.nan],['a','b',np.nan],['k',np.nan,np.nan],['d','j','h']],
                 columns=list('ABC'))
df4=copy.deepcopy(df3)
print(df3,'\n')
#缺失值全部用 0 填充
print(df3.fillna(0),'\n')
#method=‘pad’,使B列每一个缺失值用缺失值的前一个值填充
df3['B'].fillna(method='pad',inplace=True)
print(df3,'\n')
#用replace替换
print(df4,'\n')
df4.replace(np.nan,'juejin',inplace = True)
print('将缺失值替换为juejin\n',df4)

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3       k  NaN  NaN
4       d    j    h 

        A  B  C
0       1  2  3
1  juejin  0  0
2       a  b  0
3       k  0  0
4       d  j  h 

        A  B    C
0       1  2    3
1  juejin  2  NaN
2       a  b  NaN
3       k  b  NaN
4       d  j    h 

        A    B    C
0       1    2    3
1  juejin  NaN  NaN
2       a    b  NaN
3       k  NaN  NaN
4       d    j    h
将缺失值替换为juejin
         A       B       C
0       1       2       3
1  juejin  juejin  juejin
2       a       b  juejin
3       k  juejin  juejin
4       d       j       h

Интерполяция отсутствующих значений

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

Вот несколько часто используемых репрезентативных методов интерполяции отсутствующих значений:

  • Медиана/мода/средняя интерполяция
  • Интерполяция соседей
  • лагранжева интерполяция
Медиана/мода/среднее вменение


#生成一个一维数组
s1=pd.Series([6,4,2,5,4,3,3,7,np.nan,3,9,np.nan,1])
print(s1,'\n')
med=s1.median()#中位数
mod=s1.mode()#众数
avg=s1.mean() #平均值
print('中位数,众数,平均数分别为:%.2f,%.2f,%.2f'%(med,mod,avg))
#以平均值为例
s1.fillna(avg)

0     6.0
1     4.0
2     2.0
3     5.0
4     4.0
5     3.0
6     3.0
7     7.0
8     NaN
9     3.0
10    9.0
11    NaN
12    1.0
dtype: float64 

中位数,众数,平均数分别为:4.00,3.00,4.270     6.000000
1     4.000000
2     2.000000
3     5.000000
4     4.000000
5     3.000000
6     3.000000
7     7.000000
8     4.272727
9     3.000000
10    9.000000
11    4.272727
12    1.000000
dtype: float64

Интерполяция близких значений

Этот момент фактически упоминается в приведенном выше заполнении отсутствующего значения, в основном параметр метода, вы можете выбрать тот, который находится перед позицией отсутствующего значения, или заполнить те же данные данными в позиции, вы можете обратиться к df3

fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

параметры метода: pad/ffill → заполнить предыдущими данными, backfill/bfill → заполнить более поздними данными

лагранжева интерполяция

Во многих практических задачах функции используются для представления определенных внутренних отношений или законов, и многие функции можно понять только с помощью экспериментов и наблюдений. Например, если физическая величина наблюдается на практике, соответствующие наблюдения получаются в нескольких разных местах, и метод лагранжевой интерполяции может найтимногочлен, который принимает наблюдаемое значение точно в каждой наблюдаемой точке. Такие многочлены называютсяЛагранжев (интерполяционный) многочлен. Математически лагранжева интерполяция может дать полиномиальную функцию, которая точно проходит через несколько известных точек на двумерной плоскости.

Из-за нехватки места здесь приводится грубое объяснение процесса расчета метода лагранжевой интерполяции.

Согласно математическим знаниям, для n известных точек на плоскости можно найти многочлен степени n-1:


Когда мы знаем значения предыдущих n-1 координатных точек (x1, y1), (x2, y2)...(xn-1, yn-1), мы можем получить следующую многомерную подстановку приведенной выше формулы уравнение


Через это многомерное уравнение мы можем вычислить значения параметров a0, a1, .....an-1 и узнать параметры этого многомерного уравнения, то есть мы знаем функциональное уравнение между y и x, пройти Вводя значение x, вы можете вычислить соответствующее отсутствующее значение y (аппроксимация) в форме описанного выше процесса вычисления, называемого лагранжевой интерполяцией.

В python есть библиотека инструментов, которая очень удобна для вычисления лагранжевой интерполяции, Конкретное использование и процесс реализации непосредственно реализованы в следующем коде.

Мы случайным образом выбираем набор данных (3,6), (7,9), (8,5), (9,8) с помощью лагранжевой интерполяции для расчета функционального уравнения этих точек, а затем вводим значение, которое нам нужно для интерполировать Значение x может естественным образом получить значение y.

#导入拉格朗日插值法计算和作图包
from scipy.interpolate import lagrange
import matplotlib.pyplot as plt
% matplotlib inline
#任意创建一个有缺失值的二维数组
s2=pd.DataFrame({'x':[3,7,12,8,9],'y':[6,9,np.nan,5,8]})
#x值
x=[3,7,8,9]
#y值
y=[6,9,5,8]
#生成这几个点的散点图
plt.scatter(x,y)
#求出函数方程
print(lagrange(x,y))
#选择一个x=12,计算插入值
print('插值12为%.2f' % lagrange(x,y)(12))

Сгенерированная функция (числа 3 и 2 выше представляют x³ и x²), соответствующая интерполяция отсутствующих значений и диаграмма рассеяния выглядят следующим образом:

        3        2
0.7417 x - 14.3 x + 85.16 x - 140.8

插值12为103.50

Таким образом, когда x=12, соответствующее отсутствующее значение можно заменить на 103,50.