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运算符重载用法实例
May 28 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
Python3.2模拟实现webqq登录
Feb 15 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
Python中捕获键盘的方式详解
Mar 28 Python
python覆盖写入,追加写入的实例
Jun 26 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
python基于property()函数定义属性
Jan 22 Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 Python
使用python实现时间序列白噪声检验方式
Jun 03 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 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
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
python数字图像处理之高级滤波代码详解
2017/11/23 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python 实现控制鼠标键盘
2020/11/27 Python
用Python实现职工信息管理系统
2020/12/30 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
春节请假条
2014/04/11 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
努力学习保证书
2015/02/26 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js