数据筛选与过滤:布尔索引与条件查询

数据筛选与过滤:布尔索引与条件查询 – 嘿,数据侦探们,准备好破案了吗?

各位数据侦探们,大家好!欢迎来到“数据筛选与过滤:布尔索引与条件查询”特别讲座。我是你们的老朋友,数据挖掘界的福尔摩斯,数据分析界的柯南(咳咳,虽然我还没找到我的阿笠博士)。 今天,我们要化身数据侦探,学习如何从浩瀚的数据海洋中,像捞针一样,精准地找到我们想要的目标!

数据就像一个巨大的犯罪现场,里面充斥着各种线索。而我们的任务,就是利用“布尔索引”和“条件查询”这两大神器,拨开迷雾,找出真相,让数据说话!

一、什么是布尔索引?——“是”或“否”的哲学

想象一下,你正在玩一个“猜猜我是谁”的游戏。 对方只能回答“是”或“否”。 布尔索引,就有点像这个游戏。 它利用“真”(True)和“假”(False)这两个布尔值,来标记数据集中每一行是否符合我们的条件。

举个栗子(例子):

假设我们有一张关于水果的表格(数据框),如下所示:

水果名称 颜色 价格 产地
苹果 红色 5 山东
香蕉 黄色 3 广东
葡萄 紫色 8 新疆
黄色 4 河北
草莓 红色 10 辽宁

现在,我们想要找出所有红色的水果。 这时候,布尔索引就派上用场了! 我们可以创建一个布尔索引,用来标记哪些水果是红色的。

用Python(搭配Pandas库)实现如下:

import pandas as pd

# 创建数据框
data = {'水果名称': ['苹果', '香蕉', '葡萄', '梨', '草莓'],
        '颜色': ['红色', '黄色', '紫色', '黄色', '红色'],
        '价格': [5, 3, 8, 4, 10],
        '产地': ['山东', '广东', '新疆', '河北', '辽宁']}
df = pd.DataFrame(data)

# 创建布尔索引
is_red = df['颜色'] == '红色'

print(is_red)

输出结果:

0     True
1    False
2    False
3    False
4     True
Name: 颜色, dtype: bool

看到没? is_red 就是一个布尔索引,它告诉我们:

  • 第0行(苹果)的颜色是红色,所以对应的值是 True
  • 第1行(香蕉)的颜色不是红色,所以对应的值是 False
  • 以此类推…

二、如何利用布尔索引筛选数据?—— 像魔法一样简单!

有了布尔索引,筛选数据就变得像施魔法一样简单! 只需要把布尔索引放到数据框的方括号里,就可以得到符合条件的数据子集啦!

继续上面的例子,我们想要找出所有红色的水果,可以这样做:

# 利用布尔索引筛选数据
red_fruits = df[is_red]

print(red_fruits)

输出结果:

  水果名称  颜色  价格  产地
0   苹果  红色   5  山东
4   草莓  红色  10  辽宁

Duang! 所有红色的水果都出现了! 就像变魔术一样! 🎩

三、条件查询:更强大的数据筛选利器

布尔索引很强大,但是有时候,我们需要更复杂的条件。 比如,我们想要找出所有价格大于5元的红色水果,或者所有产地是山东或辽宁的水果。 这时候,就需要用到条件查询了。

条件查询,顾名思义,就是根据一定的条件来查询数据。 这些条件可以是单个的,也可以是多个的,还可以是各种组合。

3.1 单个条件查询:简单直接,一击命中

单个条件查询,就像一个训练有素的狙击手,一枪命中目标。 比如,我们想要找出所有价格大于5元的水果:

# 单个条件查询:找出价格大于5元的水果
expensive_fruits = df[df['价格'] > 5]

print(expensive_fruits)

输出结果:

  水果名称  颜色  价格  产地
2   葡萄  紫色   8  新疆
4   草莓  红色  10  辽宁

这里,df['价格'] > 5 就是一个条件,它返回一个布尔索引,然后我们再利用这个布尔索引来筛选数据。

3.2 多个条件查询:组合拳出击,无处遁形

有时候,我们需要同时满足多个条件才能找到目标。 就像侦探破案一样,需要综合考虑各种线索。 这时候,就需要用到多个条件查询了。

多个条件查询,就像一套组合拳,可以把目标打得无处遁形。 比如,我们想要找出所有价格大于5元的红色水果:

# 多个条件查询:找出价格大于5元的红色水果
expensive_red_fruits = df[(df['价格'] > 5) & (df['颜色'] == '红色')]

print(expensive_red_fruits)

输出结果:

  水果名称  颜色  价格  产地
4   草莓  红色  10  辽宁

注意:

  • 多个条件之间,需要用 & (与)或 | (或)连接。
  • 每个条件都要用括号括起来,以保证运算的优先级。

3.3 复杂条件查询:灵活多变,无所不能

条件查询还可以更加复杂,比如使用 isin() 函数来判断某个值是否在某个列表中,或者使用 str.contains() 函数来判断某个字符串是否包含某个子字符串。

举个栗子:

# 复杂条件查询:找出产地是山东或辽宁的水果
fruits_from_shandong_liaoning = df[df['产地'].isin(['山东', '辽宁'])]

print(fruits_from_shandong_liaoning)

# 复杂条件查询:找出水果名称中包含“果”字的水果
fruits_with_guo = df[df['水果名称'].str.contains('果')]

print(fruits_with_guo)

输出结果:

  水果名称  颜色  价格  产地
0   苹果  红色   5  山东
4   草莓  红色  10  辽宁

  水果名称  颜色  价格  产地
0   苹果  红色   5  山东
2   葡萄  紫色   8  新疆

四、实战演练:化身数据侦探,破解谜题!

理论知识已经掌握了,现在让我们来实战演练一下,化身数据侦探,破解几个谜题!

谜题一:找出所有价格低于6元,且颜色不是黄色的水果。

# 谜题一:找出所有价格低于6元,且颜色不是黄色的水果
fruits = df[(df['价格'] < 6) & (df['颜色'] != '黄色')]

print(fruits)

谜题二:找出所有产地包含“东”字的水果。

# 谜题二:找出所有产地包含“东”字的水果
fruits = df[df['产地'].str.contains('东')]

print(fruits)

谜题三:找出所有价格在5元到8元之间的水果。

# 谜题三:找出所有价格在5元到8元之间的水果
fruits = df[(df['价格'] >= 5) & (df['价格'] <= 8)]

print(fruits)

五、高级技巧:让你的数据筛选更上一层楼

掌握了基本的布尔索引和条件查询,你已经是一位合格的数据侦探了。 但是,想要成为顶尖的数据侦探,还需要掌握一些高级技巧!

5.1 使用query()函数:更简洁的语法

Pandas提供了一个 query() 函数,可以用更简洁的语法来进行条件查询。

例如,上面的“找出所有价格大于5元的红色水果”的例子,可以用 query() 函数这样写:

# 使用 query() 函数
expensive_red_fruits = df.query("价格 > 5 and 颜色 == '红色'")

print(expensive_red_fruits)

query() 函数的优点是语法更简洁,更易读。 但是,它也有一些限制,比如不能使用复杂的Python表达式。

5.2 使用loc[]iloc[]:更精确的定位

loc[]iloc[] 可以用来更精确地定位数据。 loc[] 使用标签(行索引和列名)来定位数据,而 iloc[] 使用整数索引来定位数据。

例如,我们可以使用 loc[] 来筛选出所有红色的水果的“水果名称”和“价格”列:

# 使用 loc[] 函数
red_fruits_name_price = df.loc[df['颜色'] == '红色', ['水果名称', '价格']]

print(red_fruits_name_price)

输出结果:

  水果名称  价格
0   苹果   5
4   草莓  10

六、总结:数据筛选的艺术

恭喜各位数据侦探,经过今天的学习,你们已经掌握了布尔索引和条件查询这两大神器! 掌握了它们,你就可以像福尔摩斯一样,从数据中发现隐藏的秘密,让数据说话!

数据筛选是一门艺术,也是一门技术。 只有不断地练习,才能熟练掌握它,才能成为真正的数据大师!

最后,送给大家一句名言:

数据不会说谎,但是会隐藏真相。 只有善于挖掘的人,才能找到真相!

希望大家在数据挖掘的道路上越走越远,发现更多有趣的秘密!

附录:常用符号与函数

符号/函数 含义
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
&
|
~
isin() 判断某个值是否在某个列表中
str.contains() 判断某个字符串是否包含某个子字符串
query() 使用更简洁的语法进行条件查询
loc[] 使用标签来定位数据
iloc[] 使用整数索引来定位数据

好了,今天的讲座就到这里。 感谢大家的参与! 希望下次还能和大家一起探索数据的奥秘! 拜拜! 👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注