【跟着stackoverflow学Pandas】Select rows from a DataFrame based on values in a column -pandas 筛选

32 篇文章 1 订阅
8 篇文章 0 订阅

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

专栏地址:http://blog.csdn.net/column/details/16726.html

以 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']

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

探索者v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值