pandas按条件筛选数据的实现


Posted in Python onFebruary 20, 2021

pandas中对DataFrame筛选数据的方法有很多的,以后会后续进行补充,这里只整理遇到错误的情况。

1.使用布尔型DataFrame对数据进行筛选

使用一个条件对数据进行筛选,代码类似如下:

num_red=flags[flags['red']==1]

使用多个条件对数据进行筛选,代码类似如下:

stripes_or_bars=flags[(flags['stripes']>=1) | (flags['bars']>=1)]

常见的错误代码如下:

代码一:

stripes_or_bars=flags[flags['stripes']>=1 or flags['bars']>=1]

代码二:

stripes_or_bars=flags[flags['stripes']>=1 | flags['bars']>=1].

代码三:

stripes_or_bars=flags[(flags['stripes']>=1) or (flags['bars']>=1)]

以上这三种代码的错误提示都是:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 中括号里面的逻辑式如何解析的暂时不清楚。貌似不能使用and、or及not。

除了使用组合的逻辑表达式之外,使用返回类型为布尔型值的函数也可以达到筛选数据的效果。示例如下:

import pandas as pd
import numpy as np
df=pd.DataFrame(np.array(range(10)).reshape((5,-1)))
df.columns=['0','1']
df=df[df['1'].isin([3,5,9])]

 其df的结果如下:

pandas按条件筛选数据的实现

2.iloc()方法、ix()方法和iloc()方法的区别

首先dataframe一般有两种类型的索引:第一种是位置索引,即dataframe自带的从0开始的索引,这种索引叫位置索引。另一种即标签索引,这种索引是你在创建datafram时通过index关键字,或者通过其他index相关方法重新给dataframe设置的索引。这两种索引是同时存在的。一般设置了标签索引之后,就不在显示位置索引,但不意味着位置索引就不存在了。

假设有如下几行数据(截图部分只是数据的一部分),很明显,以下显示的索引为标签索引。同时574(标签索引)行对应的位置索引则为0,1593行对应的位置索引为2, 以此类推。

pandas按条件筛选数据的实现

先来看loc(),其API网址http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.htm,函数名下方有一行解释,Access a group of rows and columns by label(s) or a boolean array.. loc[] is primarily label based, but may also be used with a boolean array. 

代码一:

first_listing = normalized_listings.loc[[0,4]]

结果如下,可以看出其输出的是dataframe中标签索引为0和4的两行数据。注意,如果标签索引的类型为字符串,则在loc中也要用字符串的形式。

pandas按条件筛选数据的实现

再来看iloc(),其API网址http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html,函数名下方的解释为 Purely integer-location based indexing for selection by position. .iloc[] is primarily integer position based ( from 0 to length-1 of the axis), but may also be used with a boolean array.

代码二:

first_listing = normalized_listings.iloc[[0,4]]

结果如下,可以看出其输出的dataframe中第0行和第4行的数据,即按方法是按照位置索引取得数。注意使用位置索引的时候只能用整数(integer position,bool类型除外)

pandas按条件筛选数据的实现

另外,还可以向loc和iloc中传入bool序列,这样就可以将前面介绍的boo表达式用到loc和iloc中。下面来看看怎么使用bool序列?

import pandas as pd
data=pd.DataFrame(data={'col1':[1,2,3,5,10],'col2':[50,90,67,75,100]},\
         index=['a','b','c','d','e'])
print(data)
#iloc[]示例,iloc似乎不能直接使用逻辑表达式的结果,我这里将其转置成list之后就可以用了,原因暂且不明
data_1=data.iloc[list(data['col1']>5)]
print(data_1)
#loc[]示例,loc中可以直接使用逻辑表达式
data_2=data.loc[data['col1']>5]
print(data_2)

在iloc[]中,如果直接使用loc中的逻辑表达式而不进行list()转化的话,会提示ValueError: iLocation based boolean indexing cannot use an indexable as a mask错误。

如果查看上述两段代码中得到的first_listing。我们会发现两处first_listing的类型均为datafrarm。loc和iloc除了能对行进行筛选,还可以筛选列。如果在loc和iloc中设定了对列的筛选,则筛选之后得到的数据可能是datafrme类型,也有可能是Series类型。下面直接以代码运行结果进行说明。

import pandas as pd
data=pd.DataFrame(data={'col1':[1,2,3,5,10],'col2':[50,90,67,75,100]},\
         index=['a','b','c','d','e'])
print(data)
#iloc[]示例 ,在使用iloc的时候,[]里面无论是筛选行还是筛选列,都只能使用数字形式的行号或列号。
#这里如果使用‘col2',这里会报错
data_1=data.iloc[[0,4],[1]]#当需要筛选出多列或者希望返回的结果为DataFrame时,可以将列号用[]括起来。
print(data_1)
print(type(data_1))
data_2=data.iloc[[0,4],1]#当只需要筛选出其中的一列时可以只写一个列号,不加中括号,这种方法得到的是一个Series
print(data_2)
print(type(data_2))
#loc[]示例
data_3=data.loc[['a','e'],['col2']]
print(data_3)
print(type(data_3))
data_4=data.loc[['a','e'],'col2']
print(data_4)
print(type(data_4))

具体的代码执行结果如下:

pandas按条件筛选数据的实现

最后看ix()方法,其API网址http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.ix.html,其解释为 A primarily label-location based indexer, with integer position fallback.

代码三:

first_listing = normalized_listings.ix[[0,4]]

结果如下似乎与loc()方法的结果是相同的,但是从其给出的解释来看,其好像是前两个方法的集合。

pandas按条件筛选数据的实现

到此这篇关于pandas按条件筛选数据的实现的文章就介绍到这了,更多相关pandas 条件筛选 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
基于python实现微信模板消息
Dec 21 Python
python使用sqlite3时游标使用方法
Mar 13 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
django富文本编辑器的实现示例
Apr 10 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
Python学习笔记之While循环用法分析
Aug 14 Python
pytorch中的inference使用实例
Feb 20 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 Python
python实现b站直播自动发送弹幕功能
Feb 20 #Python
如何用 Python 制作 GitHub 消息助手
Feb 20 #Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 #Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 #Python
安装不同版本的tensorflow与models方法实现
Feb 20 #Python
python爬虫scrapy基本使用超详细教程
Feb 20 #Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 #Python
You might like
php获取301跳转URL简单实例
2013/12/16 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
js实现图片实时时钟
2020/01/15 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
python实现简易动态时钟
2018/11/19 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
keras 多任务多loss实例
2020/06/22 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
ORACLE十问
2015/04/20 面试题
孝老爱亲模范事迹材料
2014/05/25 职场文书
会计学自荐信
2014/06/03 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
国际贸易实训报告
2014/11/05 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js