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 实现插入排序算法
Jun 05 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
django框架cookie和session用法实例详解
Dec 10 Python
PyTorch中的C++扩展实现
Apr 02 Python
Python如何合并多个字典或映射
Jul 24 Python
python之语音识别speech模块
Sep 09 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 23 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
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
php 魔术方法详解
2014/11/11 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
浅析使用Python操作文件
2017/07/31 Python
Python学习小技巧总结
2018/06/10 Python
python梯度下降法的简单示例
2018/08/31 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
使用python计算三角形的斜边例子
2020/04/15 Python
Python turtle库的画笔控制说明
2020/06/28 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
迎接领导欢迎词
2014/01/11 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
烹调加工管理制度
2014/02/04 职场文书
银行简历自我评价
2014/02/11 职场文书
会走路的树教学反思
2014/02/20 职场文书
教师党员公开承诺事项
2014/05/28 职场文书