0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

pandas筛选数据的8个小技巧

数据分析与开发 来源:Python数据科学 作者:东哥起飞 2021-09-26 11:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

日常用Python做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘。东哥总结了日常查询和筛选常用的种骚操作,供各位学习参考。本文采用sklearnboston数据举例介绍。

fromsklearnimportdatasets
importpandasaspd

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

9f72463a-1114-11ec-8fb8-12bb97331649.png

1. []

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

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

9f8862e4-1114-11ec-8fb8-12bb97331649.png

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

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

9f96c9ba-1114-11ec-8fb8-12bb97331649.png

2. loc/iloc

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

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

9fae84a6-1114-11ec-8fb8-12bb97331649.png

3. isin

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

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

9fbd671e-1114-11ec-8fb8-12bb97331649.png

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

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

9fcf1112-1114-11ec-8fb8-12bb97331649.png

4. str.contains

上面的举例都是数值大小比较的筛选条件,除数值以外当然也有字符串的查询需求pandas里实现字符串的模糊筛选,可以用.str.contains()来实现,有点像在SQL语句里用的是like。下面利用titanic的数据举例,筛选出人名中包含Mrs或者Lily的数据,|或逻辑符号在引号内。

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

9fe358de-1114-11ec-8fb8-12bb97331649.png

.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()

9ff0217c-1114-11ec-8fb8-12bb97331649.png

也可以用other赋给指定值。

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

9ffc2c10-1114-11ec-8fb8-12bb97331649.png

甚至还可以写组合条件。

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

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

a00930cc-1114-11ec-8fb8-12bb97331649.png

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

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

a0174b8a-1114-11ec-8fb8-12bb97331649.png

6. query

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

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

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

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

a02756e2-1114-11ec-8fb8-12bb97331649.png

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的

a052a612-1114-11ec-8fb8-12bb97331649.png

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)

a088f6b8-1114-11ec-8fb8-12bb97331649.png

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

>>>train.isnull().any(axis=1).sum()
>>>708
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7314

    浏览量

    93946
  • SQL
    SQL
    +关注

    关注

    1

    文章

    789

    浏览量

    46351
  • python
    +关注

    关注

    57

    文章

    4856

    浏览量

    89554

原文标题:pandas 筛选数据的 8 个骚操作

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    填补国际空白!SiC 功率模块老化筛选试验标准出炉

    《基于感性负载的 SiC 功率模块老化筛选试验方法》正式发布并同步实施。该标准历经起草小组研讨、广泛征求行业意见、委员会草案投票等规范流程,由第三代半导体产业技术创新战略联盟(CASA)发布,填补了国际上 SiC 功率模块感性负载老化筛选领域的标准空白,为产业规模
    的头像 发表于 12-05 09:40 298次阅读

    应用生命周期管理Perforce ALM 产品更新详解:标签和筛选功能

    Perforce ALM更新标签与筛选功能!支持自定义标签、收藏常用项、高级条件组合,网页端和桌面端体验全面升级,让复杂的需求管理更高效、追溯更清晰。
    的头像 发表于 11-25 11:08 296次阅读
    应用生命周期管理Perforce ALM 产品更新详解:标签和<b class='flag-5'>筛选</b>功能

    医疗PCBA代工厂筛选指南

    当医疗设备企业在筛选 PCBA 代工伙伴时,那些真正能贴合行业特性、紧跟趋势的企业,才能成为长期信赖的助力。新飞佳科技便是这样的存在 —— 从全面通过 ISO 13485、ISO 9001 等资质
    的头像 发表于 10-30 14:53 156次阅读
    医疗PCBA代工厂<b class='flag-5'>筛选</b>指南

    订单多条件筛选接口设计与实现

    ​  背景需求 在电商系统中,订单管理模块常需支持多维度组合查询。典型筛选条件包括: 时间范围:$t in [t_{text{start}}, t_{text{end}}]$ 订单状态:$s
    的头像 发表于 10-16 14:14 143次阅读
    订单多条件<b class='flag-5'>筛选</b>接口设计与实现

    电源芯片一次筛选:复杂流程下的高要求与高效应对

    一次筛选:芯片可靠性的“第一道防线”在集成电路从设计到量产的全流程中,一次筛选是保障产品质量的核心环节。它位于封装测试阶段前端,通过多维度的严格测试,如电性能测试、环境应力筛选(如高低温、湿度测试
    的头像 发表于 08-15 08:48 626次阅读
    电源芯片一次<b class='flag-5'>筛选</b>:复杂流程下的高要求与高效应对

    使用8数据总线时,FX3的GPIF II DQ[15:8]状态如何?

    我使用CYUSB 3013 -BZXC FX3 设备(16 位 GPIF II 数据总线版本)从 ADC 采集数据。ADC 为 10 位,但通常 8 位就足够了,因此我制作了两不同的
    发表于 05-09 06:44

    具有4降压稳压器、1LDO和8位ADC的DA9080 PMIC数据手册

    锁定(UVLO)、过流保护(OC)和用于故障保护功能的热保护。 DA9080 采用32 引脚 QFN 封装。 *附件:具有4降压稳压器、1LDO和8位ADC的DA9080 PMIC数据
    的头像 发表于 04-02 16:54 676次阅读
    具有4<b class='flag-5'>个</b>降压稳压器、1<b class='flag-5'>个</b>LDO和<b class='flag-5'>8</b>位ADC的DA9080 PMIC<b class='flag-5'>数据</b>手册

    高端水果价格跳水!高光谱技术如何影响水果品质筛选

    高光谱技术在水果果实的品质检测中展现了强大的优势,能够精准识别损伤部位,并有效评估损伤程度,从而提升筛选效率和果品质量。无论是车厘子、青香蕉还是黄桃,高光谱技术都能提供一致且可靠的检测结果,确保水果的质量符合市场要求。
    的头像 发表于 02-19 16:16 558次阅读
    高端水果价格跳水!高光谱技术如何影响水果品质<b class='flag-5'>筛选</b>?

    Aigtek高电压放大器微流控细胞筛选测试

    微流控技术是一种在微小尺度上操控流体的高科技技术,具有极高的应用价值。其中,微流控细胞筛选作为一种重要的应用方向,已经引起了广泛关注。本文Aigtek 安泰电子 将介绍微流控细胞筛选的基本概念
    的头像 发表于 01-20 16:33 676次阅读
    Aigtek高电压放大器微流控细胞<b class='flag-5'>筛选</b>测试

    DAC3283到底是8位的LVDS输入数据还是16位的LVDS输入数据

    请问这个DAC到底是8位的LVDS输入数据还是16位的LVDS输入数据啊。。也就是说,这个I路的15:8和7:0,是一16位
    发表于 12-31 08:27

    将ADS8638设置为自动模式,8通道采集,但是读到的数据通道顺序是70123456,为什么?

    我将ADS8638设置为自动模式,8通道采集,但是读到的数据通道顺序是70123456,数据也是正确的,通道序号第一不是应该是0通道的
    发表于 12-20 14:45

    如何进行元器件筛选

    电子元件的核心作用在电子设备中,电子元件扮演着基础而关键的角色,它们是电子通信、数据处理和自动化控制等技术领域的基石。筛选的必要性为了确保电子元件在其整个使用寿命内都能稳定工作,避免因元件本身的缺陷
    的头像 发表于 12-19 12:37 1408次阅读
    如何进行元器件<b class='flag-5'>筛选</b>?

    想测试一8通道的热电偶,有什么芯片可以直接测试然后出数据吗?

    我想测试一8通道的热电偶,有什么芯片可以直接测试然后出数据吗?
    发表于 12-16 07:46

    ADS8568的8通道通过SPI读取到的数据都是一样的,为什么?

    28335与ADS8568的SPI通信问题: 在给了convst信号并且片选使能ADS8568后,先SPI发送一个数据给从模块ADS8568,然后读取到ADS8568的模拟量采集值, 发现只能
    发表于 12-13 08:03

    dac38rf89想发送的8数,应该如何安排这8数,在128bit中的位置呢?

    最近我正在用dac38rf89,用到41121模式,该模式下数据格式,如果JESD204b端为FPGA的话,需要发送128bit数据,对应于16*8,即发送8
    发表于 12-12 06:06