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

pandas 筛选数据的 8 个神操作

大家好,我是东哥。

本篇是pandas神操作系列的第 20 篇:pandas筛选数据的 8 个神操作。系列内容,请看????「pandas100个神操作」话题。


日常用Python做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘。

东哥总结了日常查询和筛选常用的种神操作,供各位学习参考。本文采用sklearnboston数据举例介绍。

from sklearn import datasets
import pandas as pd

boston = datasets.load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)

1. []

第一种是最快捷方便的,直接在dataframe的[]中写筛选的条件或者组合条件。比如下面,想要筛选出大于NOX这变量平均值的所有数据,然后按NOX降序排序。

df[df['NOX']>df['NOX'].mean()].sort_values(by='NOX',ascending=False).head()

当然,也可以使用组合条件,条件之间使用逻辑符号& |等。比如下面这个例子除了上面条件外再加上且条件CHAS为1,注意逻辑符号分开的条件要用()隔开。

df[(df['NOX']>df['NOX'].mean())& (df['CHAS'] ==1)].sort_values(by='NOX',ascending=False).head()

2. loc/iloc

[]之外,loc/iloc应该是最常用的两种查询方法了。loc按标签值(列名和行索引取值)访问,iloc按数字索引访问,均支持单值访问或切片查询。除了可以像[]按条件筛选数据以外,loc还可以指定返回的列变量,从行和列两个维度筛选。

比如下面这个例子,按条件筛选出数据,并筛选出指定变量,然后赋值。

df.loc[(df['NOX']>df['NOX'].mean()),['CHAS']] = 2

3. isin

上面我们筛选条件< > == !=都是个范围,但很多时候是需要锁定某些具体的值的,这时候就需要isin了。比如我们要限定NOX取值只能为0.538,0.713,0.437中时。

df.loc[df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

当然,也可以做取反操作,在筛选条件前加~符号即可。

df.loc[~df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

4. str.contains

上面的举例都是数值大小比较的筛选条件,除数值以外当然也有字符串的查询需求pandas里实现字符串的模糊筛选,可以用.str.contains()来实现,有点像在SQL语句里用的是like

下面利用titanic的数据举例,筛选出人名中包含Mrs或者Lily的数据,|或逻辑符号在引号内。

train.loc[train['Name'].str.contains('Mrs|Lily'),:].head()

.str.contains()中还可以设置正则化筛选逻辑。

  • case=True:使用case指定区分大小写

  • na=True:就表示把有NAN的转换为布尔值True

  • flags=re.IGNORECASE:标志传递到re模块,例如re.IGNORECASE

  • regex=True:regex :如果为True,则假定第一个字符串是正则表达式,否则还是字符串

5. where/mask

在SQL里,我们知道where的功能是要把满足条件的筛选出来。pandas中where也是筛选,但用法稍有不同。

where接受的条件需要是布尔类型的,如果不满足匹配条件,就被赋值为默认的NaN或其他指定值。举例如下,将Sexmale当作筛选条件,cond就是一列布尔型的Series,非male的值就都被赋值为默认的NaN空值了。

cond = train['Sex'] == 'male'
train['Sex'].where(cond, inplace=True)
train.head()

也可以用other赋给指定值。

cond = train['Sex'] == 'male'
train['Sex'].where(cond, other='FEMALE', inplace=True)

甚至还可以写组合条件。

train['quality'] = ''
traincond1 = train['Sex'] == 'male'
cond2 = train['Age'] > 25

train['quality'].where(cond1 & cond2, other='低质量男性', inplace=True)

maskwhere是一对操作,与where正好反过来。

train['quality'].mask(cond1 & cond2, other='低质量男性', inplace=True)

6. query

这是一种非常优雅的筛选数据方式。所有的筛选操作都在''之内完成。

# 常用方式
train[train.Age > 25]
# query方式
train.query('Age > 25')

上面的两种方式效果上是一样的。再比如复杂点的,加入上面的str.contains用法的组合条件,注意条件里有''时,两边要用""包住。

train.query("Name.str.contains('William') & Age > 25")

query里还可以通过@来设定变量。

name = 'William'
train.query("Name.str.contains(@name)")

7. filter

filter是另外一个独特的筛选功能。filter不筛选具体数据,而是筛选特定的行或列。它支持三种筛选方式:

  • items:固定列名

  • regex:正则表达式

  • like:以及模糊查询

  • axis:控制是行index或列columns的查询

下面举例介绍下。

train.filter(items=['Age', 'Sex'])
train.filter(regex='S', axis=1) # 列名包含S的
train.filter(like='2', axis=0) # 索引中有2的
train.filter(regex='^2', axis=0).filter(like='S', axis=1)

8. any/all

any方法意思是,如果至少有一个值为True结果便为Trueall需要所有值为True结果才为True,比如下面这样。

>> train['Cabin'].all()
>> False
>> train['Cabin'].any()
>> True

anyall一般是需要和其它操作配合使用的,比如查看每列的空值情况。

train.isnull().any(axis=0)

再比如查看含有空值的行数。

>>> train.isnull().any(axis=1).sum()
>>> 708

原创不易,欢迎点赞、留言、分享,支持我继续写下去。

参考:

[1] https://pandas.pydata.org/

[2] https://www.gairuo.com/p/pandas-selecting-data

[3] https://blog.csdn.net/weixin_43484764/article/details/89847241

RECOMMEND

推荐阅读

如果你想充分发挥Python的强大作用,如果你想成为一名好的Python工程师,你应该先学好Pandas。 


这是一本全面覆盖了Pandas使用者的普遍需求和痛点的著作,基于实用、易学的原则,从功能、使用、原理等多个维度对Pandas做了全方位的详细讲解,既是初学者系统学习Pandas难得的入门书,又是有经验的Python工程师案头必不可少的查询手册。 


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 8月书讯(上)| 这些新书不可错过

书讯 | 8月书讯(下)| 这些新书不可错过

资讯 | 【大咖发声】如何写出好程序?

书单 | 秋招、考研、金九银十跳槽季,打好基础让你起飞!(这里有一份导图和书单值得收藏)

干货 | 数据中台即服务——数据中台的四大支柱

收藏 | 3个最常见案例详解DBA日常维护

上新 | 【新书速递】Serverless架构从原理、入门到实战的技术指南

点击阅读全文购买

相关文章:

  • 零售业电商标签从0到1的构建方法
  • 宜家如何利用低代码平台提升员工效率,提高数据价值
  • 什么是云原生?有哪些发展方向?终于有人讲明白了
  • 10本书,帮你看清未来的科技趋势
  • InnoDB是如何存数据的?
  • 大咖对话 | 企业数字化转型破局之道
  • 学习微服务最好的方式:阅读《微服务架构设计模式》
  • 憧憬6G,共同定义6G
  • 14个Pandas神操作,手把手教你写代码
  • 【第70期】终于找到了!AI学习路线图——从零基础到就业
  • 架构大咖说丨顶级架构师 = 技术大牛?
  • 什么是Serverless?有哪些应用?终于有人讲明白了
  • Linux30岁生日:Linux 成功的真正原因
  • 【新书速递】“帆船书”——数据库领域殿堂级作品,全新升级第7版!
  • 送你一份入门前端学习路线图
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • CSS 专业技巧
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • es6(二):字符串的扩展
  • ES6简单总结(搭配简单的讲解和小案例)
  • k8s如何管理Pod
  • nodejs调试方法
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Redis字符串类型内部编码剖析
  • Terraform入门 - 1. 安装Terraform
  • 老板让我十分钟上手nx-admin
  • 你不可错过的前端面试题(一)
  • 排序算法学习笔记
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 手写双向链表LinkedList的几个常用功能
  • 延迟脚本的方式
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Java总结 - String - 这篇请使劲喷我
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (AngularJS)Angular 控制器之间通信初探
  • (C语言)字符分类函数
  • (poj1.2.1)1970(筛选法模拟)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (篇九)MySQL常用内置函数
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)scrum常见工具列表
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 反射的使用
  • .NET 使用 XPath 来读写 XML 文件
  • .net 受管制代码
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件