Pandas实战秘籍:轻松驾驭重复值与异常值的处理艺术,让数据清洗更高效!

在这里插入图片描述

1.导包

import numpy as np
import pandas as pd

2.删除重复行

def make_df(indexs,columns):
    data = [[str(j)+str(i) for j in columns] for i in indexs]
    df = pd.DataFrame(data=data,index=indexs,columns=columns)
    return df
  • 使用 duplicated() 函数检测重复的行
    • 返回元素为布尔类型的 Series 对象
    • 每个元素对应一行,如果该行不是第一次出现,则元素为 True
df = make_df([1,2,3,4],list("ABCD"))
df
ABCD
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
4A4B4C4D4
# 让第一行和第二行值重复
df.loc[1] = df.loc[2]
df
ABCD
1A2B2C2D2
2A2B2C2D2
3A3B3C3D3
4A4B4C4D4
# 判断是否和前面的行重复(第二行和第一行的值重复)
df.duplicated()
1    False
2     True
3    False
4    False
dtype: bool
# 默认保留第一行
df.duplicated(keep="first")
1    False
2     True
3    False
4    False
dtype: bool
# 保留最后一行
df.duplicated(keep="last")
1     True
2    False
3    False
4    False
dtype: bool
# 标记所有的重复行,不保留任何一行
df.duplicated(keep=False)
1     True
2     True
3    False
4    False
dtype: bool
# 行的值不完全一样的情况
df.loc[1,"D"] = "DDD"
df
ABCD
1A2B2C2DDD
2A2B2C2D2
3A3B3C3D3
4A4B4C4D4
df.duplicated()
1    False
2    False
3    False
4    False
dtype: bool
# subset:子集,指定列的值是否重复
df.duplicated(subset=["A","B","C"])
1    False
2     True
3    False
4    False
dtype: bool
  • 使用 drop_duplicates() 函数删除重复的行
# 删除行的值完全一样的情况
df.drop_duplicates()
ABCD
1A2B2C2DDD
2A2B2C2D2
3A3B3C3D3
4A4B4C4D4
# 删除支持列的值相同的行
df.drop_duplicates(subset=["A","B","C"])
ABCD
1A2B2C2DDD
3A3B3C3D3
4A4B4C4D4
# keep:指定保留的行
df.drop_duplicates(subset=["A","B","C"],keep="last")
ABCD
2A2B2C2D2
3A3B3C3D3
4A4B4C4D4

3.映射

映射的含义:创建一个映射关系列表,把 values 元素和一个特定的标签或者字符串绑定。

包含三种操作:

  • replace()函数:替换元素
  • map()函数:新建一列,最重要
  • rename()函数:替换索引

(1)replace()函数:替换元素

  • 使用replace()函数,对values进行替换操作
index = ["张三","张三丰","李白","杜甫"]
columns = ["Python","Java","H5","UI"]
data = np.random.randint(0,100,size=(4,4))

df = pd.DataFrame(data=data,index=index,columns=columns)
df
PythonJavaH5UI
张三35354659
张三丰46962548
李白35863432
杜甫17565029
# 替换元素
df.replace({25:50,17:100})
PythonJavaH5UI
张三35354659
张三丰46965048
李白35863432
杜甫100565029

(2)map()函数:适合处理某一单独的列

  • map()函数中可以使用lambda函数
df2 = df.copy()
df2
PythonJavaH5UI
张三35354659
张三丰46962548
李白35863432
杜甫17565029
# map一般用在Series数据结构,不能用于DataFrame
df2["Python"].map({35:35,46:46,17:100})
张三      35
张三丰     46
李白      35
杜甫     100
Name: Python, dtype: int64
# 将Python的每个人的成绩乘以10
df2["Python"].map(lambda x:x*10)
张三     350
张三丰    460
李白     350
杜甫     170
Name: Python, dtype: int64
# 新增一列
df2["Pandas"] = df2["Python"].map(lambda x:x*10)
df2
PythonJavaH5UIPandas
张三35354659350
张三丰46962548460
李白35863432350
杜甫17565029170
# 新增一列:判断Java的成绩是否及格
df2["Java是否及格"] = df2["Java"].map(lambda n:"及格" if n>=60 else "不及格")
df2
PythonJavaH5UIPandasJava是否及格
张三35354659350不及格
张三丰46962548460及格
李白35863432350及格
杜甫17565029170不及格
# 使用普通函数
# 新增一列:判断UI成绩
# <40 不及格
# 40<=n<50 及格
# >=50 优秀

def fn(n):
    if n < 40:
        return "不及格"
    elif n < 50:
        return "及格"
    return "优秀"

df2 ["UI等级"] = df2["UI"].map(fn)
df2
PythonJavaH5UIPandasJava是否及格UI等级
张三35354659350不及格优秀
张三丰46962548460及格及格
李白35863432350及格不及格
杜甫17565029170不及格不及格

(3)rename()函数:替换索引

df3 = df.copy()
df3
PythonJavaH5UI
张三35354659
张三丰46962548
李白35863432
杜甫17565029
# 默认修改行索引名
df3.rename({"张三":"Mr Zhang"})
PythonJavaH5UI
Mr Zhang35354659
张三丰46962548
李白35863432
杜甫17565029
# 修改行索引名
df3.rename(index={"张三":"Mr Zhang"})
PythonJavaH5UI
Mr Zhang35354659
张三丰46962548
李白35863432
杜甫17565029
# 修改列索引名
df3.rename({"Python":"派森"},axis=1)
派森JavaH5UI
张三35354659
张三丰46962548
李白35863432
杜甫17565029
df3.rename(columns={"Python":"派森"})
派森JavaH5UI
张三35354659
张三丰46962548
李白35863432
杜甫17565029
# 重置索引
df3.reset_index()
indexPythonJavaH5UI
0张三35354659
1张三丰46962548
2李白35863432
3杜甫17565029
# 设置行索引
df3.set_index(keys=["H5"])
PythonJavaUI
H5
46353559
25469648
34358632
50175629

(4)apply()函数:既支持 Series,也支持 DataFrame

df = pd.DataFrame(data=np.random.randint(0,10,size=(5,3)),
                  index=list("ABCDE"),
                  columns=["Python","NumPy","Pandas"]
                 )
df
PythonNumPyPandas
A402
B655
C870
D145
E872
# 用于Series,期中x表示Series中的元素
df["Python"].apply(lambda x: True if x>5 else False)
A    False
B     True
C     True
D    False
E     True
Name: Python, dtype: bool
# 用于DataFrame,其中x是DataFrame中某列或某行的Series数据
# 求每一列数据的平均值
df.apply(lambda x:x.mean(),axis=0)
Python    5.4
NumPy     4.6
Pandas    2.8
dtype: float64
# 求每一行数据的平均值
df.apply(lambda x:x.mean(),axis=1)
A    2.000000
B    5.333333
C    5.000000
D    3.333333
E    5.666667
dtype: float64
# 自定义方法
def fn2(x):
    # 平均值和计算
    return (np.round(x.mean(),1),x.count())
df.apply(fn2,axis=1)
A    (2.0, 3)
B    (5.3, 3)
C    (5.0, 3)
D    (3.3, 3)
E    (5.7, 3)
dtype: object
# applymap:DataFrame专有的方法,其中的x是每个元素
df.applymap(lambda x:x + 100)
PythonNumPyPandas
A104100102
B106105105
C108107100
D101104105
E108107102

(5)transform()函数

df = pd.DataFrame(data=np.random.randint(0,10,size=(5,3)),
                  index=list("ABCDE"),
                  columns=["Python","NumPy","Pandas"]
                 )
df
PythonNumPyPandas
A791
B169
C574
D117
E162
# Series中使用transform
# 可以执行多项计算
df["Python"].transform([np.sqrt,np.exp])
sqrtexp
A2.6457511096.633158
B1.0000002.718282
C2.236068148.413159
D1.0000002.718282
E1.0000002.718282
# DataFrame中使用transform
def convert(x):
    if x.mean() > 5:
        return x * 10
    return x * (-10)

# 处理每一列
df.transform(convert)
PythonNumPyPandas
A-7090-10
B-1060-90
C-5070-40
D-1010-70
E-1060-20
# 处理每一行
df.transform(convert, axis=1)
PythonNumPyPandas
A709010
B106090
C507040
D-10-10-70
E-10-60-20

4.异常值检测和过滤

  • describe():查看每一列的描述性统计量
df = pd.DataFrame(data=np.random.randint(0,10,size=(5,3)),
                  index=list("ABCDE"),
                  columns=["Python","NumPy","Pandas"]
                 )
df
PythonNumPyPandas
A012
B781
C615
D284
E667
df.describe()
PythonNumPyPandas
count5.000005.0000005.000000
mean4.200004.8000003.800000
std3.033153.5637062.387467
min0.000001.0000001.000000
25%2.000001.0000002.000000
50%6.000006.0000004.000000
75%6.000008.0000005.000000
max7.000008.0000007.000000
# 自定义百分数
df.describe([0.01,0.3,0.4,0.9,0.99])
PythonNumPyPandas
count5.000005.0000005.000000
mean4.200004.8000003.800000
std3.033153.5637062.387467
min0.000001.0000001.000000
1%0.080001.0000001.040000
30%2.800002.0000002.400000
40%4.400004.0000003.200000
50%6.000006.0000004.000000
90%6.600008.0000006.200000
99%6.960008.0000006.920000
max7.000008.0000007.000000
# 行列转置
df.describe([0.01,0.3,0.4,0.9,0.99]).T
countmeanstdmin1%30%40%50%90%99%max
Python5.04.23.0331500.00.082.84.46.06.66.967.0
NumPy5.04.83.5637061.01.002.04.06.08.08.008.0
Pandas5.03.82.3874671.01.042.43.24.06.26.927.0
  • df.std():可以求得DataFrame对象每一列的标准差
df.std()
Python    3.033150
NumPy     3.563706
Pandas    2.387467
dtype: float64
  • df.drop():删除特定索引
df2 = df.copy()
df2
PythonNumPyPandas
A012
B781
C615
D284
E667
# 默认删除行
df2.drop("A")
PythonNumPyPandas
B781
C615
D284
E667
df2.drop(index="A")
PythonNumPyPandas
B781
C615
D284
E667
# 删除列
df2.drop("Python",axis=1)
NumPyPandas
A12
B81
C15
D84
E67
df2.drop(columns="Python")
NumPyPandas
A12
B81
C15
D84
E67
# 删除多列或多行
df2.drop(columns=["NumPy","Python"])
Pandas
A2
B1
C5
D4
E7
df2.drop(index=["A","B"])
PythonNumPyPandas
C615
D284
E667
# inplace修改原数据
df2.drop(index=["A","B"],inplace=True)
df2
PythonNumPyPandas
C615
D284
E667
  • unique():唯一,去重(只能用于Series一维数组)
# DataFrame没有unique属性,Series调用unique
df["Python"].unique()
array([0, 7, 6, 2])
  • df.query:按条件查询
# 找到Python列中等于6的所有行
df.query("Python == 6")
PythonNumPyPandas
C615
E667
df.query("Python > 6")
PythonNumPyPandas
B781
df.query("Python < 6")
PythonNumPyPandas
A012
D284
# and,&
df.query("Python > 6 and NumPy == 8")
PythonNumPyPandas
B781
df.query("Python > 6 & NumPy == 8")
PythonNumPyPandas
B781
# or,|
df.query("Python > 6 or NumPy == 8")
PythonNumPyPandas
B781
D284
df.query("Python > 6 | NumPy == 8")
PythonNumPyPandas
B781
D284
# in(成员运算符)
df.query("Python in [0,2,7]")
PythonNumPyPandas
A012
B781
D284
# 使用变量@符号
n = 7
df.query("Python == @n")
PythonNumPyPandas
B781
m = [0,2,7]
df.query("Python in @m")
PythonNumPyPandas
A012
B781
D284
  • df.sort_values():根据值排序
  • df.sort_index():根据索引排序
# sort_values:默认按照列名排序,默认升序(常用)
df.sort_values("Python")
PythonNumPyPandas
A012
D284
C615
E667
B781
# ascending:是否升序,默认是True
df.sort_values("Python",ascending=False)
PythonNumPyPandas
B781
C615
E667
D284
A012
# 根据行索引名排序,会把列进行排序(不常用)
df.sort_values("B",axis=1)
PandasPythonNumPy
A201
B178
C561
D428
E766
# 按照索引名排序,默认是对行索引进行排序,默认是升序
df.sort_index(ascending=False)
PythonNumPyPandas
E667
D284
C615
B781
A012
# 按照列索引排序
df.sort_index(ascending=False,axis=1)
PythonPandasNumPy
A021
B718
C651
D248
E676
  • df.info():查看数据信息
# info:常用
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, A to E
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   Python  5 non-null      int32
 1   NumPy   5 non-null      int32
 2   Pandas  5 non-null      int32
dtypes: int32(3)
memory usage: 272.0+ bytes
  • 练习:

新建一个形状为10000*3的标准正态分布的DataFrame(np.random.randn),去除掉所有满足以下情况的行:其中任一元素绝对值大约3陪标准差

df = pd.DataFrame(np.random.randn(10000,3))
df
012
0-0.7423361.219393-0.982067
1-0.4323671.697112-0.159940
20.079646-0.234158-0.500751
3-0.106336-0.0333810.645390
4-1.799314-1.511863-1.160497
............
9995-1.4807270.7168630.080706
99960.453228-0.3605981.056758
99971.3655731.1005290.574414
99980.606161-0.111569-0.423250
9999-0.199662-1.0316381.920479

10000 rows × 3 columns

# 过滤掉 大于3陪标准差的行
# 标准差 df.std(),绝对值 df.abs()
# cond:找到每一个元素是否大于3陪标准差
cond = df.abs() > df.std()*3
cond
012
0FalseFalseFalse
1FalseFalseFalse
2FalseFalseFalse
3FalseFalseFalse
4FalseFalseFalse
............
9995FalseFalseFalse
9996FalseFalseFalse
9997FalseFalseFalse
9998FalseFalseFalse
9999FalseFalseFalse

10000 rows × 3 columns

# 找到存在大于3陪标准差的行
cond2 = cond.any(axis=1)
cond2
0       False
1       False
2       False
3       False
4       False
        ...  
9995    False
9996    False
9997    False
9998    False
9999    False
Length: 10000, dtype: bool
# bool值索引,过滤异常值(大于3陪标准差)
df.loc[~cond2]
012
0-0.7423361.219393-0.982067
1-0.4323671.697112-0.159940
20.079646-0.234158-0.500751
3-0.106336-0.0333810.645390
4-1.799314-1.511863-1.160497
............
9995-1.4807270.7168630.080706
99960.453228-0.3605981.056758
99971.3655731.1005290.574414
99980.606161-0.111569-0.423250
9999-0.199662-1.0316381.920479

9925 rows × 3 columns

5.抽样

  • 使用 .take() 函数排序
  • 可以借助 np.random.permutation() 函数随机排序

无放回抽样

df2 = pd.DataFrame(data=np.random.randint(0,10,size=(3,3)),
                  index=list("CDE"),
                  columns=["Python","NumPy","Pandas"]
                 )
df2
PythonNumPyPandas
C769
D896
E744
# [1,0,2]对应行索引,行排序
df2.take([1,0,2])
PythonNumPyPandas
D896
C769
E744
# 列排序
df2.take([1,0,2],axis=1)
NumPyPythonPandas
C679
D986
E474
# 随机排列
np.random.permutation([0,1,2])
array([0, 2, 1])
# 无放回抽样:一次随机取出,没有重复值
df2.take(np.random.permutation([0,1,2]))
PythonNumPyPandas
E744
D896
C769

有放回抽样

# 有放回抽样:可能会出现重复值
np.random.randint(0,3,size=5)
array([1, 2, 1, 0, 2])
df2.take(np.random.randint(0,3,size=5))
PythonNumPyPandas
E744
D896
E744
D896
D896

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/764828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在 PMP 考试中,项目管理经验不足怎么办?

在项目管理的专业成长之路上&#xff0c;PMP认证如同一块里程碑&#xff0c;标志着从业者的专业水平达到了国际公认的标准。然而&#xff0c;对于那些项目管理经验尚浅的考生来说&#xff0c;这座里程碑似乎显得有些遥不可及。那么&#xff0c;在PMP考试准备中&#xff0c;项目…

高考志愿填报,AI搜索商业化的第一个金矿?

文&#xff1a;互联网江湖 作者&#xff1a;志刚 前几天高考放榜&#xff0c;很多朋友都在忙着给孩子或者亲戚家孩子报志愿&#xff0c;高考志愿咨询也火得一塌糊涂&#xff0c;张雪峰的志愿咨询产品也卖出了天价。 今年高考前夕&#xff0c;网红张雪峰旗下的“峰学蔚来”APP…

【MySQL8.0】 CentOS8.0下安装mysql报错权限问题的记录

这里写自定义目录标题 基本信息问题记录 基本信息 OS: Linux server-02 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux MySQL: 8.0 问题记录 缺少类库 mysql: error while loading shared libraries: libncurses.so.5: cannot…

使用目标检测模型YOLO V10 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

这个是在YOLO V10源码的基础上实现的。我只是在源码的基础上做了些许的改动。 YOLO V10源码&#xff1a;YOLO V10源码 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了YOLO 以前版本在后处理和模型架…

【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

MySQL实战-4 | 深入浅出索引(上)(下)

什么是数据库索引&#xff0c;索引又是如何工作的呢&#xff1f; 一句话简单来说&#xff0c;索引的出现其实就是为了提高数据查询的效率&#xff0c;就像书的目录一样。一本 500 页的书&#xff0c;如果你想快速找到其中的某一个知识点&#xff0c;在不借助目录的情况下&…

Git使用中遇到的问题(随时更新)

问题1.先创建本地库&#xff0c;后拉取远程仓库时上传失败的问题怎么解决&#xff1f; 操作主要步骤&#xff1a; step1 设置远程仓库地址: $ git remote add origin gitgitee.com:yourAccount/reponamexxx.git step2 推送到远程仓库: $ git push -u origin "master&qu…

【知识图谱系列】一步步指导:安装与配置JDK和Neo4j的完美搭配

本文将提供详细的步骤&#xff0c;介绍如何下载、安装和配置Java开发工具包&#xff08;JDK&#xff09;以及流行的图形数据库Neo4j。将从选择合适的JDK版本开始&#xff0c;然后是下载和配置环境变量&#xff0c;接着以同样的方式处理Neo4j。最后&#xff0c;会通过一些检查步…

架构练习题目

【2022下架构真题第24题&#xff1a;红色】 24.在分布式系统中&#xff0c;中间件通常提供两种不同类型的支持&#xff0c;即&#xff08;27) A.数据支持和交互支持 B.交互支持和提供公共服务 C.数据支持和提供公共服务 D.安全支持和提供公共服务 解答&#xff1a;答案选择B。…

Android原生与flutter模块交互

Flutter定义了三种不同类型的Channel&#xff1a; BasicMessageChannel&#xff1a;用于传递字符串和半结构化的信息&#xff0c;持续通信&#xff0c;收到消息后可以回复此次消息&#xff0c;如&#xff1a;Native将遍历到的文件信息陆续传递到Dart&#xff0c;在比如&#xf…

goframe框架规范限制(but it should be named with “Res“ suffix like “XxxRes“)

背景&#xff1a; 首页公司最近要启动一个项目&#xff0c;公司主要业务是用java开发的&#xff0c;但是目前这个方向的项目&#xff0c;公司要求部署在主机上&#xff0c;就是普通的一台电脑上&#xff0c;电脑配置不详&#xff0c;还有经常开关机&#xff0c;所以用java面临…

MatLab 二维图像绘制基础

MatLab 二维图像绘制基础 plot 描点绘图 %% % 二维绘图 &#xff0c;plot进行描点&#xff0c;步长越小&#xff0c;越平滑 x [1:9]; y [0.1:0.2:1.7]; X x y*i; % 复数 plot(X)plot绘制矩阵 %% % 当X Y 为矩阵时&#xff0c;对应矩阵中的元素依次绘制 t 0:0.01:2*pi; …

黄子韬vs徐艺洋卫生间风波

【热搜爆点】黄子韬VS徐艺洋&#xff1a;卫生间风波背后的职场与友情界限探讨在这个充满欢笑与意外的综艺时代&#xff0c;《跟我出游吧》再次以它独有的魅力&#xff0c;引爆了一个既尴尬又引人深思的话题——“黄子韬要上徐艺洋的卫生间&#xff1f;”这不仅仅是一句简单的调…

ctfshow-web入门-命令执行(web75-web77)

目录 1、web75 2、web76 3、web77 1、web75 使用 glob 协议绕过 open_basedir&#xff0c;读取根目录下的文件&#xff0c;payload&#xff1a; c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). ); } ex…

构建LangChain应用程序的示例代码:49、如何使用 OpenAI 的 GPT-4 和 LangChain 库实现多模态问答系统

! pip install "openai>1" "langchain>0.0.331rc2" matplotlib pillow加载图像 我们将图像编码为 base64 字符串&#xff0c;如 OpenAI GPT-4V 文档中所述。 import base64 import io import osimport numpy as np from IPython.display import HT…

宠物空气净化器哪个品牌性价比高?宠物空气净器Top3品牌推荐

养猫确实给家庭带来了无尽的欢乐&#xff0c;但猫毛无处不在的问题确实让不少猫主人感到头疼。不论是长毛猫还是短毛猫&#xff0c;它们掉落的浮毛飘浮在空气中&#xff0c;不仅影响家居环境的整洁度&#xff0c;还可能成为过敏的源头。因此&#xff0c;如何高效地处理这些猫浮…

ollama open-webui安装后报错401

查看日志 docker logs open-webui "GET /ollama/api/tags HTTP/1.1" 500 Internal Server Error "GET /ollama/api/version HTTP/1.1" 500 Internal Server Error "GET /openai/api/models HTTP/1.1" 401 Unauthorized 浏览器console报错

关于 element-ui el-cascader 数据回显问题的解决方案

前言 这两天在使用 el-cascader 控件时&#xff0c;后端日期的数据如“2023-05-06”前端需要按照“年-月-日”的形式分割成三级联动&#xff0c;因为数据库保存的是完整的日期&#xff0c;前端数据回显时需要对后端返回的数据进行处理。 问题再现 联动下拉框的数据如下&#x…

【开源合规】开源许可证基础知识与风险场景引入

文章目录 什么是开源许可证(License)?开源许可证有什么用?开源许可证分类开源许可证分类及描述公共代码 (Public Domain)CC0无License宽松型许可证 (Permissive)MITApache 2.0BSD弱互惠型许可证 (Weak Copyleft)LGPLMPLEPL互惠型许可证 (Reciprocal)GPLEUPL强互惠许可证 (Str…

阿里云centos 取消硬盘挂载并重建数据盘信息再次挂载

一、取消挂载 umount [挂载点或设备] 如果要取消挂载/dev/sdb1分区&#xff0c;可以使用以下命令&#xff1a; umount /dev/sdb1 如果要取消挂载在/mnt/mydisk的挂载点&#xff0c;可以使用以下命令&#xff1a; umount /mnt/mydisk 如果设备正忙&#xff0c;无法立即取消…