当前位置: 首页 > news >正文

pandas数据清洗总结

目录

  • 前言
  • 对重复值识别及处理
    • df.duplicated()
    • 实战
  • 对缺失值的识别及处理
    • df.dropna()
    • df.fillna()
    • 实战
  • 对异常值的识别及处理
  • 综合实战

前言

pandas数据清洗,一般包括对重复值的处理,对缺失值的处理及异常值的处理;下面分别介绍。

对重复值识别及处理

对重复值的处理,一般会涉及到对重复值的判断,及对重复值的删除操作,会使用到df.duplicated()函数及df.drop_duplicates()。
下面重点介绍一下df.duplicated()函数。

df.duplicated()

df.duplicated()是一个用于检测DataFrame中重复行的函数。它返回一个布尔型的Series,表示每一行是否为重复行。如果一行是重复行,则对应的布尔值为True,否则为False。

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

该函数的常用参数包括:

subset:指定要考虑的列,默认情况下会考虑所有列。可以传入一个列名或者列名的列表来指定特定的列进行重复行检测。
keep:指定保留哪一个重复行。默认值为’first’,表示保留第一次出现的重复行;可以设置为’last’,表示保留最后一次出现的重复行;也可以设置为False,表示所有重复行都标记为True。

df.drop_duplicates函数

df.drop_duplicates(subset=None, keep=‘first’,inplace=False)

实战

import pandas as pd df = pd.DataFrame({'brand': ['YumYum','YumYum', 'YumYum', 'Indomie', 'Indomie', 'Indomie'],'style': ['cup','cup', 'cup', 'cup', 'pack', 'pack'],'rating': [4, 4, 4, 3.5, 15, 5]})
print(df)
print(any(df.duplicated()))print(df.drop_duplicates())
##print(df.drop_duplicates(inplace =True))brand style  rating
0   YumYum   cup     4.0
1   YumYum   cup     4.0
2   YumYum   cup     4.0
3  Indomie   cup     3.5
4  Indomie  pack    15.0
5  Indomie  pack     5.0
Truebrand style  rating
0   YumYum   cup     4.0
3  Indomie   cup     3.5
4  Indomie  pack    15.0
5  Indomie  pack     5.0

上述例子中,使用了any(df.duplicated())判断数据集中是否有重复值,删除使用的是df.drop_duplicates(),一切参数都是默认的,需要注意的是如果你重新打印df结果和第一次一样,因为df.drop_duplicates()中inplace默认为False,如果你真的想删除重复值可以设置inplace =True;

对缺失值的识别及处理

对缺失值(python中为NaN)识别一般用df.isnull(),对缺失值的处理一般有删除和填充两种方法,删除的话一般使用df.dropna()函数
填充的话一般使用df.fillna()来填充缺失值。

df.dropna()

df.dropna() 方法可以用来删除DataFrame中包含任何NaN值的行或列。默认情况下,它会删除包含至少一个NaN值的行。
基本用法:

# 删除包含NaN值的行
df_cleaned = df.dropna()# 删除包含NaN值的列
df_cleaned = df.dropna(axis=1)

参数详解:
axis: 0为行 1为列,default 0,数据删除维度
how: {‘any’, ‘all’}, default ‘any’,any:删除带有nan的行;all:删除全为nan的行
thresh: int,保留至少 int 个非nan行
subset: list,在特定列缺失值处理
inplace: bool,是否修改源文件

df.fillna()

df.fillna() 方法用于用特定值填充DataFrame中的NaN值。

基本用法:

# 使用0填充所有NaN值
df_filled = df.fillna(0)# 使用前一个有效值填充
df_filled = df.fillna(method='ffill')# 使用后一个有效值填充
df_filled = df.fillna(method='bfill')

参数详解:
value: 单一值、字典或Series,用于填充NaN值。
method: ‘ffill’ 或 ‘pad’ 代表前向填充,‘bfill’ 或 ‘backfill’ 代表后向填充。
limit: 限制填充的次数。

实战

data = {'A': [1, 2, np.nan], 'B': [5, np.nan, np.nan], 'C': [1, 2, 3]}
df = pd.DataFrame(data)print(df)
print(any(df.isnull()))# 删除包含NaN值的行
df_cleaned = df.dropna()
print(df_cleaned)# 删除包含NaN值的列
df_cleaned = df.dropna(axis=1)
print(df_cleaned)A    B  C
0  1.0  5.0  1
1  2.0  NaN  2
2  NaN  NaN  3
TrueA    B  C
0  1.0  5.0  1C
0  1
1  2
2  3
import pandas as pd
import numpy as npdata = {'A': [1, 2, np.nan], 'B': [5, np.nan, np.nan], 'C': [1, 2, 3]}
df = pd.DataFrame(data)print(df)
print(any(df.isnull()))# 填充包含NaN值的行
df1 = df.fillna(value=0)
print(df1)# 使用前一个有效值填充
df2 = df.fillna(method='ffill')
print(df2)
#填充统计学相关值
df2['A'] = df['A'].fillna(df['A'].mean())
df2['B'] = df['B'].fillna(df['B'].median())
df2['C'] = df['C']
print(df2)A    B  C
0  1.0  5.0  1
1  2.0  NaN  2
2  NaN  NaN  3
TrueA    B  C
0  1.0  5.0  1
1  2.0  0.0  2
2  0.0  0.0  3A    B  C
0  1.0  5.0  1
1  2.0  5.0  2
2  2.0  5.0  3A    B  C
0  1.0  5.0  1
1  2.0  5.0  2
2  1.5  5.0  3

对异常值的识别及处理

对异常值的识别有z得分法,分位数法,距离法,对异常值的处理有删除和填充,如果异常值占比较小(<5%)可以考虑直接删除。填充一般采用使用统计学方法进行填充。

在这里插入图片描述
假设我们定义年龄超过60岁为异常值,我们可以用中位数替换这些值:

df.loc[df['Age'] > 60, 'Age'] = df['Age'].median()

综合实战

import numpy as np
df =pd.DataFrame({'name':['张三','李四','王五','赵六','孙七','钱八'],'gender':['男','女','女','女','男','男'],'Age':[23,np.nan,34,25,27,65],'Email':['we4567@163.com','7545852@qq.com','','wek24345@gmail.com','5554589@126.com','2378eww3d@sina.com'],'RegistrationDate':['2021-10-04','2023-01-10','2010-10-21',' 2022-05-35','2018-12-25','2000-05-06']
},columns=['name','gender','Age','Email','RegistrationDate'])print(df)# 处理缺失值
df['Age'] = df['Age'].fillna(df['Age'].mean())
df['Email'] = df['Email'].replace('', np.nan).fillna('unknown@example.com')# 处理异常值
df.loc[df['Age'] > 60, 'Age'] = df['Age'].median()# 处理日期格式
df['RegistrationDate'] = pd.to_datetime(df['RegistrationDate'], errors='coerce')print(df)name gender   Age               Email RegistrationDate
0   张三      男  23.0      we4567@163.com       2021-10-04
1   李四      女   NaN      7545852@qq.com       2023-01-10
2   王五      女  34.0                           2010-10-21
3   赵六      女  25.0  wek24345@gmail.com       2022-05-35
4   孙七      男  27.0     5554589@126.com       2018-12-25
5   钱八      男  65.0  2378eww3d@sina.com       2000-05-06name gender   Age                Email RegistrationDate
0   张三      男  23.0       we4567@163.com       2021-10-04
1   李四      女  34.8       7545852@qq.com       2023-01-10
2   王五      女  34.0  unknown@example.com       2010-10-21
3   赵六      女  25.0   wek24345@gmail.com              NaT
4   孙七      男  27.0      5554589@126.com       2018-12-25
5   钱八      男  30.5   2378eww3d@sina.com       2000-05-06

http://www.mrgr.cn/news/50952.html

相关文章:

  • U9销售订单不能带出最新价格出来
  • 医学和生信web APP 平台- Appmatrix
  • Vue的生命周期
  • LeetCode146. LRU 缓存(2024秋季每日一题 37)
  • NVIC和EXIT寄存器工作
  • MediaGo:革新视频下载体验的开源神器
  • 深入解析CSS中的!important规则
  • C++ 的特性可以不用在主函数中调用
  • 【AI学习】Mamba学习(六):HiPPO论文中的离散化SSM的矩阵近似计算
  • OpenCV-人脸检测
  • 从零开始的LeetCode刷题日记:102.二叉树的层序遍历
  • RHCE第一天
  • C语言[经典题——4×5矩形阵]
  • Servlet的HttpServletRequest
  • [结构体]谁考了第k名
  • k8s 1.28 集群部署
  • 自定义类型:结构体【上】
  • error: cannot find symbol import android.os.SystemProperties;
  • 阐述懒加载?
  • 嵌入式硬件设计