最近做一个系列博客,跟着stackoverflow学Pandas。

以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序:

https://stackoverflow.com/questions/tagged/pandas?sort=votes&pageSize=15

Select rows from a DataFrame based on values in a column -pandas 筛选

https://stackoverflow.com/questions/17071871/select-rows-from-a-dataframe-based-on-values-in-a-column-in-pandas

pandas的筛选功能,跟excel的筛选功能类似,但是功能更强大。

在SQL数据中, 我们可以用这样的语句:

select * from table where colume_name = some_value. 

bool 索引

在Pandas的DataFrame格式中可以采用 bool 值作为索引,选取数据行。比如:

import pandas as pd

# Create data set
d = {'foo':[100, 111, 222],
     'bar':[333, 444, 555]}
df = pd.DataFrame(d)
# Full dataframe:
df
# Shows:
#    bar   foo
# 0  333   100
# 1  444   111
# 2  555   222

# bool 值索引

df[[True, False, True]] # 或 df.loc[[True, False, True]]
# 都可以得到

#   bar foo
#0  333 100
#1  444 111

所以,如果想通过数值来对行进行筛选,我们可以通过构造bool值来选择DataFrame的行

  1. df[df['column_name'] == some_value] 如果是数值型,也可以采用 >/<

  2. df[df['column_name'].isin(some_values)] some_values 可以是单个变量,也可以是list 或者迭代器

  3. 组合多种条件

df[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

df[(df['column_name'] == some_value) | df['other_column'].isin(some_values)]
#注意,& | 的优先级很高,所以每个条件都需要一个括号
  1. 不等于,可以使用
df[~df['column_name'].isin(some_values)]

df[df['column_name'] != some_value]

np.where

与上面所述的方法有所不同, np.where 返回的是行的位置,所以在获取行时不能采用df, 要采用df.loc 或者 df.iloc

np.where(df.A.values=='foo')
# (array([0, 2, 4, 6, 7]),)
df.iloc[np.where(df.A.values=='foo')]

query

DataFrame 提供了query函数,方便我们可以采用表达式来进行数据的筛选。

参考:

http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query

n = 10
df = pd.DataFrame(np.random.randint(n, size=(n, 2)), columns=list('bc'))

#    b  c
# 0  9  0
# 1  1  2
# 2  2  4
# 3  7  6
# 4  6  4
# 5  4  7
# 6  2  9
# 7  4  8
# 8  6  2
# 9  9  0

df.query('index > b > c')
#   b   c
# 8 6   2

#可以采用的表达式很多,比如
df.query('(a < b) & (b < c)')
df.query('a < b and b < c')
df.query('color == "red"')

时间测评

import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split()})
df.iloc[np.where(df.A.values=='foo')]

%timeit df.iloc[np.where(df.A.values=='foo')]
#1000 loops, best of 3: 274 µs per loop

%timeit df.loc[np.where(df.A.values=='foo')]
#1000 loops, best of 3: 342 µs per loop

%timeit df.loc[df['A'] == 'foo']
#1000 loops, best of 3: 347 µs per loop

%timeit df[df['A'] == 'foo']
#1000 loops, best of 3: 354 µs per loop

%timeit df.loc[df['A'].isin(['foo'])]
#1000 loops, best of 3: 265 µs per loop

%timeit df[df.A=='foo']
#1000 loops, best of 3: 357 µs per loop

%timeit df.query('(A=="foo")')
#1000 loops, best of 3: 943 µs per loop

可以发现采用 df.iloc[np.where(df.A.values=='foo')]df.loc[df['A'].isin(['foo'])] 速度比较快, 而采用query的方法比较慢。

df.loc[df['A'] == 'foo'] 速度快于 df[df['A'] == 'foo']

【跟着stackoverflow学Pandas】Select rows from a DataFrame based on values in a column -pandas 筛选的更多相关文章

  1. 【跟着stackoverflow学Pandas】How to iterate over rows in a DataFrame in Pandas-DataFrame按行迭代

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  2. 【跟着stackoverflow学Pandas】 - Adding new column to existing DataFrame in Python pandas - Pandas 添加列

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  3. 【跟着stackoverflow学Pandas】 -Get list from pandas DataFrame column headers - Pandas 获取列名

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  4. 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  5. 【跟着stackoverflow学Pandas】“Large data” work flows using pandas-pandas大数据处理流程

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  6. 【跟着stackoverflow学Pandas】Delete column from pandas DataFrame-删除列

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  7. 【跟着stackoverflow学Pandas】Renaming columns in pandas-列的重命名

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  8. 跟着百度学PHP[14]-PDO之Mysql的事务处理2

    前面所将仅仅是在纯mysql下的讲解,这节就是要将其搬到PDO台面上来了. 将自动提交关闭. SetAttribute下有一个PDO::ATTR_AUTOCOMMIT 将其设置为0即可关闭,如:$pd ...

  9. 【跟着大佬学JavaScript】之节流

    前言 js的典型的场景 监听页面的scroll事件 拖拽事件 监听鼠标的 mousemove 事件 ... 这些事件会频繁触发会影响性能,如果使用节流,降低频次,保留了用户体验,又提升了执行速度,节省 ...

随机推荐

  1. 20145321 《Java程序设计》第5周学习总结

    20145321 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 1.Try.catch:Java中所有错误都会被打包为对象,通过try和catch语法可以对代表错误的对象做 ...

  2. 20162314 Sortingtest-work after class

    20162314 Sortingtest-work after class Content Data : 90 8 7 56 123 235 9 1 653. Use JDB or IDEA to t ...

  3. 探讨"点"语法的奥秘

    点语法 一直以来,都不理解什么是点语法,都说是相当于链接或是路径.也许我浏览的信息量少吧,看过好几篇有关的博文,没什么记载,本篇只是初步见解分析. 在javascript里,属性和方法都使用“点”语法 ...

  4. linux消息队列应用编程

    消息队列:  消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法   每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值   消息队列也有管道一样的不足,就是每个消息的 ...

  5. 解决 maven项目在eclipse中debug时看不到源码问题

    第一步: 第二步:Configurations 里面的source里面是Default.把Defaul删除,选java project ,然后添加自己的项目 第三步:选中,并用命令跑tomcat 这样 ...

  6. geoserver源码学习与扩展——restAPI访问

    产生这篇文章的想法是在前端通过js调用restAPI时,总是不成功,发送ajax请求时还总是出现类似跨域的问题,后来查找才发现,默认情况下restAPI的访问都需要管理员权限,而通过ajax请求传输用 ...

  7. java -d . **.java 与 java **.java 的区别

    如何在命令行模式下运行带包的java文件 https://blog.csdn.net/lytor/article/details/17048361 javac,使用"-d ."与省 ...

  8. Lucene 初步 之 HelloWorld

    万恶的源头 HelloWorld 要完成lucene 的配置 需要几个jar包 (如果需要可以留言我私发) 创建索引API分析: 1. Directory: 类代表一个Lucene索引的位置,FSDi ...

  9. tensorflow wide deep 介绍

    https://blog.csdn.net/heyc861221/article/details/80131369 https://blog.csdn.net/heyc861221/article/d ...

  10. Dev-C++添加代码格式化(format source code)工具Artistic Style

    Dev-C++是一个轻便的C++ IDE开发环境,比起VS2010来轻巧得多.最新的版本是5.4.0是2013年2月14日发布的,下载地址如下: Dev-C++5.4.0 download 它是开源项 ...