pandas按条件筛选数据的实现

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的结果如下:

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

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

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

先来看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中也要用字符串的形式。

再来看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类型除外)

另外,还可以向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))

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

最后看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 条件筛选 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pandas按条件筛选数据的实现

    pandas中对DataFrame筛选数据的方法有很多的,以后会后续进行补充,这里只整理遇到错误的情况. 1.使用布尔型DataFrame对数据进行筛选 使用一个条件对数据进行筛选,代码类似如下: num_red=flags[flags['red']==1] 使用多个条件对数据进行筛选,代码类似如下: stripes_or_bars=flags[(flags['stripes']>=1) | (flags['bars']>=1)] 常见的错误代码如下: 代码一: stripes_or_bars

  • pandas按若干个列的组合条件筛选数据的方法

    还是用图说话 A文件: 比如,我想筛选出"设计井别"."投产井别"."目前井别"三列数据都为11的数据,结果如下: 当然,这里的筛选条件可以根据用户需要自由调整,代码如下: # -*- coding: utf-8 -*- """ Created on Wed Nov 29 10:46:31 2017 @author: wq """ import pandas as pd #input.c

  • Python数据分析之 Pandas Dataframe条件筛选遍历详情

    目录 一.条件筛选 二.Dataframe数据遍历 for...in...语句 iteritems()方法 iterrows()方法 itertuples()方法 一.条件筛选 查询Pandas Dataframe数据时,经常会筛选出符合条件的数据,接下来介绍一下具体的使用方式. 示例Dataframe如下: 单条件筛选,例如查询gender为woman的数据: df[df["gender"]=="woman"] # 或 df.loc[df["gender

  • Python实用技巧之列表、字典、集合中根据条件筛选数据详解

    通用做法:迭代 以列表为例: 筛选出下列数字大于等于0的数 data = [2, 7, -4, -1, 3, 0, 8] res = [] for i in data: if i >= 0: res.append(i) print(res) 运行结果: [2, 7, 3, 0, 8] 奇淫巧技--列表筛选 使用filter函数 随机生成一组正负数皆有的数,筛选出大于等于0的数 flilter(function or None, iterable) from random import randi

  • 浅谈pandas筛选出表中满足另一个表所有条件的数据方法

    今天记录一下pandas筛选出一个表中满足另一个表中所有条件的数据.例如: list1 结构:名字,ID,颜色,数量,类型. list1 = [['a',1,255,100,'03'],['a',2,481,50,'06'],['a',47,255,500,'03'],['b',3,1,50,'11']] list2结构:名字,类型,颜色. list2 = [['a','03',255],['a','06',481]] 如何在list1中找出所有与list2中匹配的元素?要得到下面的结果:lis

  • Python实现多条件筛选目标数据功能【测试可用】

    本文实例讲述了Python实现多条件筛选目标数据功能.分享给大家供大家参考,具体如下: python中提供了一些数据过滤功能,可以使用内建函数,也可以使用循环语句来判断,或者使用pandas库,当然在有些情况下使用pandas是为了提高工作效率.举例如下: a = [('chic', 'JJ'), ('although', 'IN'), ('menu', 'JJ'), ('items', 'NNS'), ('doesnt', 'JJ'), ('scream', 'NN'), ('french',

  • pandas 按日期范围筛选数据的实现

    pandas 是 python 中一个功能强大的库,这里就不再复述了,简单介绍下用日期范围筛选 pandas 数据. 日期转换 用来筛选的列是 date 类型,所以这里要把要筛选的日期范围从字符串转成 date 类型 比如我的数据包含列名为 trade_date,从 20050101 - 20190926 的数据,我要筛选出 20050606 - 20071016 的数据,那么,先如下转换数据类型: s_date = datetime.datetime.strptime('20050606',

  • Python Pandas条件筛选功能

    目录 一.准备数据 二.以>,<,==,>=,<=来进行选择 三..isin() 四..str.contains()实现 一.准备数据 import pandas as pd   data = pd.read_excel(r'销售数据.xlsx') print(data) 数据如下: 二.以>,<,==,>=,<=来进行选择 “等于”一定是用‘==’,如果用‘=’就不是判断大小了: 例如:筛选销售员是马姐的数据 df = data[data['销售员'] =

  • Pandas条件筛选与组合筛选的使用

    目录 条件筛选 组合筛选 在使用pandas进行数据分析时,经常需要根据逻辑条件来筛选数据. 如果使用 for循环语句 遍历的方式来查找,将十分耗时. 推荐使用pandas自身的功能函数进行筛选,效率更高. 以下列出笔者常用的筛选方法. 条件筛选 根据具体值筛选 df[df['Num'] == 10] df[df['Name'] == 'Tom'] 找出df中值在具体列表中的数据 val_list = [100, 200, 300] df[df['Num'].isin(val_list)] 筛选

  • 基于JavaScript实现前端数据多条件筛选功能

    有时候也会需要在前端进行数据筛选,增强交互体验.当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很大麻烦.下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置. 仿照京东的筛选条件,这里就取价格区间和品牌作为测试. 代码 代码中主要使用js的过滤器Array.prototype.filter,该方法会对数组元素进行遍历检查,返回一个符合检查条件的新数组,不会改变原数组. // filter() var foo = [0,1,2,3,4,5,6,7,8,9]; var f

随机推荐