您现在的位置是:网站首页> 编程资料编程资料
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参数确定要标记的重复项(如果有),选项有:
提示: 本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- 详解Python OpenCV图像分割算法的实现_python_
- Pandas数据分析固定时间点和时间差_python_
- python 中pass和match使用方法_python_
- numpy中数组拼接、数组合并方法总结(append(), concatenate, hstack, vstack, column_stack, row_stack, np.r_, np.c_等)_python_
- numpy拼接矩阵的实现_python_
- 关于pyqt5弹出提示框的详细介绍_python_
- 基于Python实现文本文件转Excel_python_
- Python时间戳与日期格式之间相互转化的详细教程_python_
- python词云库wordcloud自定义词云制作步骤分享_python_
- python数据分析之时间序列分析详情_python_
