您现在的位置是:网站首页> 编程资料编程资料

pandas数据清洗(缺失值和重复值的处理)_python_

2023-05-26 366人已围观

简介 pandas数据清洗(缺失值和重复值的处理)_python_

前言

pandas对大数据有很多便捷的清洗用法,尤其针对缺失值和重复值。缺失值就不用说了,会影响计算,重复值有时候可能并未带来新的信息反而增加了计算量,所以有时候要进行处理。针对一些文本数据可能不合要求的还要进行替换什么的。

首先导入包:

import numpy as np import pandas as pd

缺失值处理

'''一般使用特殊类型 NaN 代表缺失值,可以用 Numpy 可定义它np.NaN/np.nan。在 Pandas 1.0 以后实验性地使用一个标量 pd.NA 来代表。
如果想把正负无穷也为认是缺失值,可以通过以下全局配置来设定:'''

pandas.options.mode.use_inf_as_na = True #以下数据 NaN 为缺失值: df=(pd.DataFrame(np.random.randn(5, 3),index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) .reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])) df

缺失值的判断

#可以判断是否缺失值,DataFrame 和 Series 一般都支持。:

# 不是缺失值 df.one.notna()

df.isna() # 是缺失值

df[df.one.notna()]# 进行筛选

#需要注意的是,Numpy 中 np.nan 和 np.nan 不相等,因此不能用 ==/!= 进行对比: None == None # noqa: E711 # True np.nan == np.nan # False None == np.nan # False

其他方法:

df.notna() df['team'].isna() df['team'].isnull()

缺失值统计

df.isnull().sum()#计算每列缺失值个数 df.isnull().sum(1)#计算每行缺失值个数 df.isnull().sum().sum()#总共缺失值个数

缺失值筛选

df.loc[df.isna().any(1)]# 有缺失值的行 df.loc[:,df.isna().any()] # 有缺失值的列 df.loc[~(df.isna().any(1))] # 没有缺失值的行 df.loc[:,~(df.isna().any())] # 没有缺失值的列

缺失值类型

#时间中的缺失值 #对于时间中的缺失值,Pandas 提供了一个 NaT 来表示,并且 NaT 和 NaN 之间是兼容的: df['timestamp'] = pd.Timestamp('20120101') df.loc[['a', 'c', 'h'], ['one', 'timestamp']] = np.nan df.timestamp

 #整型中的缺失值,由于 NaN 是浮点型,因此一列甚至缺少一个整数的整数列都将转换为浮点。

pd.Series([1, 2, np.nan, 4], dtype=pd.Int64Dtype())

 插入缺失值

 #可以使用 None 等方法将内容修改为缺失值: s.loc[0] = None s.loc[1] = np.nan df.two = pd.NA

缺失值填充

首先生成案例数据:

df = pd.DataFrame([[np.nan, 2, np.nan, 0], [3, 4, np.nan, 1], [np.nan, np.nan, np.nan, 5], [np.nan, 3, np.nan, 4]], columns=list('ABCD')) df

fillna(x) 可以将缺失值填充指定的值。以下为几种常见的填充方法:

df.fillna(0)# 填充为 0 # 填充为指定字符 df.fillna('missing') df.fillna('暂无') df.fillna('待补充') df.one.fillna('暂无') # 指定字段填充 df.one.fillna(0, inplace=Ture) # 使填充内容生效 df.fillna(0, limit=1) # 只替换第一个 values = {'A': 0, 'B': 1, 'C': 2, 'D': 3} # 不同列替换不同的值 df.fillna(value=values)

 不指定值,使用一定的方法。

#使用 method{‘backfill', ‘bfill', ‘pad', ‘ffill', None}, default None df.fillna(method='backfill')# 使用上一个有效值填充 df.fillna(method='bfill')# 同 backfill df.fillna(method='pad')# 把当前值广播到后边的缺失值 df.fillna(method='ffill')# 同 pad #fillna(method='ffill') 可以简写为 ffill() , fillna(method='bfill') 可以简写为 bfill()

使用计算值填充:

# 填充列的平均值 df.fillna(df.mean()) # 对指定列填充平均值 df.fillna(df.mean()['B':'C']) # 填充列的平均值,另外一个方法 df.where(pd.notna(df), df.mean(), axis='columns') #特别的计算: # 第一个非空值 df.fillna(method='bfill').head(1).iloc[0] # 第一个非空值索引 df.notna().idxmax() df.apply(pd.Series.first_valid_index)

插值填充

插值方式,以下是一个非常简单的示例,其中一个值是缺失的,我们对它进行差值:

s = pd.Series([0, 1,4,9, np.nan, 25]) s.interpolate()

 9和25之间的中间点为17,就把缺失值补为了17,这是线性插值。

s.interpolate(method='spline',order=2)

这是二级多项式插值。用X^2这个函数去插值的,

interpolate() 的具体参数

'''默认linear 方法,会认为是一条直线。

计算方法:

默认 method=‘linear’ 如果你的数据增长速率越来越快,可以选择 method='quadratic' 二次插值。如果数据集呈现出累计分布的样子,
推荐选择 method='pchip'。如果需要填补缺省值,以平滑绘图为目标,推荐选择 method='akima'。method='akima' 和 method = ‘pchip’,
需要你的环境中安装了 Scipy 库。除此之外,method='barycentric' 和 method='pchip' 同样也需要 Scipy 才能使用。

使用插值方法,可为:

  • linear:线性,忽略索引,并将值等距地对待,这是MultiIndexes支持的唯一方法
  • time:时间,以插值给定的时间间隔长度处理每日或更高粒度的数据
  • index, values:索引,值,使用索引的实际数值
  • pad:使用现有值填写NaN。
  • ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘spline’, ‘barycentric’, ‘polynomial’:
  • 传递给 scipy.interpolate.interp1d,这些方法使用索引的数值。 ‘polynomial’ 和 ‘spline’ 都要求您还指定一个顺序(int),
  • 例如 df.interpolate(method='polynomial',order=5)
    • nearest:最近
    • zero:
    • slinear:线性
    • quadratic:二次方
    • cubic:立方
    • spline:花键,样条插值
    • barycentric:重心插值
    • polynomial:多项式
    • ‘krogh’, ‘piecewise_polynomial’, ‘spline’, ‘pchip’, ‘akima’: SciPy 类似名称的插值方法。
    • krogh: 克罗格插值
    • piecewise_polynomial: 分段多项式
    • spline: 样条插值
    • pchip: 立方插值   (累计分布)
    • akima: 阿克玛插值  (平滑绘图)
  • from_derivatives:指 scipy.interpolate.BPoly.from_derivatives,它替换了 scipy 0.18 中的 piecewise_polynomial 插值方法。

其他参数:

  • axis: 插值应用的轴方向,可选择 {0 or ‘index’, 1 or ‘columns’, None}, 默认为 None
  • limitint: 要填充的连续 NaN 的最大数量, 必须大于 0。
  • inplace: 是否将最终结果替换原数据,默认为 False
  • limit_direction: 限制方向,可传入 {‘forward’, ‘backward’, ‘both’}, 默认 ‘forward’,如果指定了限制,则将沿该方向填充连续的 NaN
  • limit_area: 限制区域,可传入 {None, ‘inside’, ‘outside’}, 默认 None,如果指定了限制,则连续的NaN将被此限制填充
  •  None: 没有填充限制
  • ‘inside’: 仅填充有效值包围的NaN(内插)
  •  ‘outside’: 仅将NaN填充到有效值之外(外推)
  • downcast: 可传入‘infer’ 或者 None, 默认是 None,如果可以向下转换 dtypes
  • **kwargs: 传递给插值函数的关键字参数 '''

 缺失值删除 

生成案例数据:

#一般删除会针对行进行,如一行中有缺失值就会删除,当然也会有针对列的。 df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'], "toy": [np.nan, 'Batmobile', 'Bullwhip'], "born": [pd.NaT, pd.Timestamp("1940-04-25"), pd.NaT]}) df

缺失值删除 dropna

# 删除所有有缺失值的行(有一个缺失就删除) df.dropna() # 删除所有有缺失值的列 df.dropna(axis='columns') df.dropna(axis=1) # 删除所有值都缺失的行 df.dropna(how='all') # 不足2个非空值时删除 df.dropna(thresh=2) # 指定判断缺失值的列范围 df.dropna(subset=['name', 'born']) # 使删除和的结果生效 df.dropna(inplace=True) # 指定列的缺失值删除 df.toy.dropna()

重复值处理

重复值的寻找主要使用duplicated,语法为:

df.duplicated(subset=None, keep='first')

'''可以返回表示重复行的布尔系列,可以指定列。keep参数确定要标记的重复项(如果有),选项有:

-六神源码网