Python缺失值处理实现

发布时间 2023-11-28 23:59:26作者: 归去_来兮

  在数据处理相关工作中,读取的数据中常常会有缺失值的情况,为顺利进行后续的操作,需要首先对缺失值进行处理,处理的方式一般为删除填充,Python中提供了专门的工具包,可以方便地进行实现。读取操作可以由pandas模块实现,通常直接读一个excel或csv文件,创建为DataFrame对象,模块中的dropna方法和fillna方法可以实现对缺失值的删除和填充。
  现有下列数据文件,文件命名为testdata.xlsx,对它进行缺失值处理。

读取数据:

import pandas as pd
data = pd.read_excel("./testdata.xlsx")

  易知数据中第4行第1列、第6行第2列、第2行第4列、第3行第4列是缺失的。

1.删除

  对于缺失的地方,可以删除所在的行或所在的列。

(1).删除含空值的行,在dropna()中加参数axis=0.

data.dropna(axis=0,inplace=True)

(2).删除含空值的列,在dropna()中加参数axis=1.

data.dropna(axis=1,inplace=True)

2.填充

  对于缺失的地方,也可以填入一个值使之不再空缺。通常填0、指定字符、中位数、均值、相邻值或拟合值。

(1).填充0

data.fillna(0,inplace=True)

(2) 填充指定字符

data.fillna('无',inplace=True)

(3) 填充整体的均值、中位数

  均值(保留一位小数):

t = np.round(np.mean(data),1)
data.fillna(t,inplace=True)

  中位数:

dnr = np.array(data)
dnr = dnr[~np.isnan(dnr)] # 非nan元素
t = np.median(dnr)  # 整体中位数
data.fillna(t,inplace=True)

(4)填充所在列的均值、中位数

  均值:

data.fillna(data.mean(),inplace=True)

  中位数:
  (奇数个元素取中间的,偶数个元素取中间两个的均值)

data.fillna(data.median(),inplace=True)

(5)填充相邻值

  a. 填充列的前相邻值

data.fillna(method='ffill',axis=0,inplace=True)

  或

data.ffill(axis=0,inplace=True)

  b. 填充列的后相邻值

data.fillna(method='bfill',axis=0,inplace=True)

  或

data.bfill(axis=0,inplace=True)

  c. 填充行的前相邻值

data.fillna(method='ffill',axis=1,inplace=True)

  或

data.ffill(axis=1,inplace=True)

  d. 填充行的后相邻值

data.fillna(method='bfill',axis=1,inplace=True)

  或

data.bfill(axis=1,inplace=True)

(6)按列填充指定内容

  有时不同列空缺数据的填充需求是不一致的,此时可以按列进行填充。
a.填充某一列
  对第4列空缺处填充列均值

mean_c4 = data['TitleC4'].mean()
data['TitleC4'].fillna(mean_c4, inplace=True)  

  对第4列空缺处填充前相邻值

data['TitleC4'].fillna(method='ffill',axis=0,inplace=True)  

  或

data['TitleC4'].ffill(axis=0,inplace=True) 

  b,用字典指定填充多列

fill_values = {'TitleC1':1111,'TitleC2':2222,'TitleC4':4444,'TitleC5':5555}
data.fillna(value=fill_values, inplace=True)  

(7)填充拟合值(插值算法)

  对于元素仅为数字的数据,缺失部分也可用插值算法填充,如线性插值、二次插值、三次插值、样条插值等。

data.interpolate(method='slinear',inplace=True)  #线性插值
data.interpolate(method='quadratic',inplace=True)  #二次插值
data.interpolate(method='cubic',inplace=True)  #三次插值



参考:
1.https://www.python100.com/html/L1PK07477FUQ.html
2.https://www.python100.com/html/120094.html
3.https://www.python100.com/html/75400.html
4.https://blog.csdn.net/weixin_46277779/article/details/126224097