• 售前

  • 售后

热门帖子
入门百科

pandas按条件筛选数据的实现

[复制链接]
123456806 显示全部楼层 发表于 2021-10-25 19:14:12 |阅读模式 打印 上一主题 下一主题
pandas中对DataFrame筛选数据的方法有许多的,以后会后续进行增补,这里只整理碰到错误的环境。
1.利用布尔型DataFrame对数据进行筛选

利用一个条件对数据进行筛选,代码类似如下:
  1. num_red=flags[flags['red']==1]
复制代码
利用多个条件对数据进行筛选,代码类似如下:
  1. stripes_or_bars=flags[(flags['stripes']>=1) | (flags['bars']>=1)]
复制代码
常见的错误代码如下:
代码一:
  1. stripes_or_bars=flags[flags['stripes']>=1 or flags['bars']>=1]
复制代码
代码二:
  1. stripes_or_bars=flags[flags['stripes']>=1 | flags['bars']>=1].
复制代码
代码三:
  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。
除了利用组合的逻辑表达式之外,利用返回范例为布尔型值的函数也可以达到筛选数据的效果。示比方下:
  1. import pandas as pd
  2. import numpy as np
  3. df=pd.DataFrame(np.array(range(10)).reshape((5,-1)))
  4. df.columns=['0','1']
  5. 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.
  1. . loc[]
复制代码
is primarily label based, but may also be used with a boolean array.

代码一:
  1. 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.
  1. .iloc[]
复制代码
is primarily integer position based ( from 0 to
  1. length-1
复制代码
of the axis), but may also be used with a boolean array.

代码二:
  1. first_listing = normalized_listings.iloc[[0,4]]
复制代码
结果如下,可以看出其输出的dataframe中第0行和第4行的数据,即按方法是按照位置索引取得数。注意利用位置索引的时间只能用整数(integer position,bool范例除外)

另外,还可以向loc和iloc中传入bool序列,如许就可以将前面先容的boo表达式用到loc和iloc中。下面来看看怎么利用bool序列?
  1. import pandas as pd
  2. data=pd.DataFrame(data={'col1':[1,2,3,5,10],'col2':[50,90,67,75,100]},\
  3.          index=['a','b','c','d','e'])
  4. print(data)
  5. #iloc[]示例,iloc似乎不能直接使用逻辑表达式的结果,我这里将其转置成list之后就可以用了,原因暂且不明
  6. data_1=data.iloc[list(data['col1']>5)]
  7. print(data_1)
  8. #loc[]示例,loc中可以直接使用逻辑表达式
  9. data_2=data.loc[data['col1']>5]
  10. 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范例。下面直接以代码运行结果进行阐明。
  1. import pandas as pd
  2. data=pd.DataFrame(data={'col1':[1,2,3,5,10],'col2':[50,90,67,75,100]},\
  3.          index=['a','b','c','d','e'])
  4. print(data)
  5. #iloc[]示例 ,在使用iloc的时候,[]里面无论是筛选行还是筛选列,都只能使用数字形式的行号或列号。
  6. #这里如果使用‘col2',这里会报错
  7. data_1=data.iloc[[0,4],[1]]#当需要筛选出多列或者希望返回的结果为DataFrame时,可以将列号用[]括起来。
  8. print(data_1)
  9. print(type(data_1))
  10. data_2=data.iloc[[0,4],1]#当只需要筛选出其中的一列时可以只写一个列号,不加中括号,这种方法得到的是一个Series
  11. print(data_2)
  12. print(type(data_2))
  13. #loc[]示例
  14. data_3=data.loc[['a','e'],['col2']]
  15. print(data_3)
  16. print(type(data_3))
  17. data_4=data.loc[['a','e'],'col2']
  18. print(data_4)
  19. 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.
代码三:
  1. first_listing = normalized_listings.ix[[0,4]]
复制代码
结果如下似乎与loc()方法的结果是类似的,但是从其给出的表明来看,其好像是前两个方法的聚集。

到此这篇关于pandas按条件筛选数据的实现的文章就先容到这了,更多相关pandas 条件筛选 内容请搜刮脚本之家从前的文章或继续欣赏下面的相关文章希望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作