查看原文
其他

pandas | 使用 df.query 字符串表达式进行数据筛选

大邓 大邓和他的Python
2024-09-09

数据分析中筛选是一个很重要的操作,在pandas.DataFrame中如何进行筛选,今天简单分享一下。


一、读入数据

import pandas as pd

df = pd.read_excel('data.xlsx')
df

Run

|    | birthday   | name    | text                         |   age | gender   |   height |   weight |
|  0 | 1985/10/08 | Alice   | 我很开心,每天都这么快乐,我很幸福 |    35 | female   |      175 |       55 |
|  1 | 95.07.07   | Mary    | 我很难过                       |    25 | female   |      165 |       50 |
|  2 | 01-11-10   | Mike    | 唉,真难受                     |    19 | male     |      180 |       75 |
|  3 | 90/2/8     | Smith   | 无所谓开心还是难过              |    30 | male     |      175 |       70 |
|  4 | 93-1-5     | Henry   | 每天赚一万,真爽!              |    27 | male     |      185 |       80 |
|  5 | 1988/2/9   | William | 爽歪歪                        |    32 | male     |      177 |       76 |
|  6 | 1986-03-21 | Will    | 天气很凉爽,很舒服              |    34 | male     |      180 |       85 |
|  7 | 1984.06.9  | Qunique | 每天开心                      |    36 | female   |      168 |       62 |
|  8 | 1993.07.09 | Sara    | 难过悲伤                      |    27 | female   |      175 |       66 |
|  9 | 92/08/09   | Hillary | 美满幸福                      |    28 | male     |      190 |       85 |



#字段的数据类型
df.dtypes
birthday object
name object
text object
age int64
gender object
height int64
weight int64
dtype: object



二、筛选

查询符合条件的记录, 有两种实现方法

  • 方法1 逻辑布尔值直接传入df[]
  • 方法2 在query方法中传入字段表达式

2.1 方法1

逻辑布尔值直接传入df[]

筛选出年龄大于25岁,身高165以上, 为女性的记录

#df[(df['age'] > 25) & (df['height'] > 165) & (df['gender'] == 'female')]
df[(df.age > 25) & (df.height > 165) & (df.gender=='female')]

Run

|    | birthday   | name    | text                           |   age | gender   |   height |   weight |
|  0 | 1985/10/08 | Alice   | 我很开心,每天都这么快乐,我很幸福  |    35 | female   |      175 |       55 |
|  7 | 1984.06.9  | Qunique | 每天开心                        |    36 | female   |      168 |       62 |
|  8 | 1993.07.09 | Sara    | 难过悲伤                        |    27 | female   |      175 |       66 |

2.2 方法2

在query方法中传入字段表达式

筛选出年龄大于25岁,身高165以上, 为女性的记录

df.query('(age > 25) & (height > 165) & (gender == "female")')

Run

|    | birthday   | name    | text                           |   age | gender   |   height |   weight |
|  0 | 1985/10/08 | Alice   | 我很开心,每天都这么快乐,我很幸福  |    35 | female   |      175 |       55 |
|  7 | 1984.06.9  | Qunique | 每天开心                        |    36 | female   |      168 |       62 |
|  8 | 1993.07.09 | Sara    | 难过悲伤                        |    27 | female   |      175 |       66 |



可见query让查询和筛选代码变的很简洁,代码更具可阅读性和理解性。

但如果条件中使用了变量该如何撰写?



三、query表达式中的变量

query字符串表达式中如果含有变量 var, 需要在该变量前加 @,

即在query字符串表达式中 @var 可以调用表达式字符串外的变量var

min_age = 25

#年龄大于25
df.query('age > @min_age')

Run

|    | birthday   | name    | text                         |   age | gender   |   height |   weight |
|  0 | 1985/10/08 | Alice   | 我很开心,每天都这么快乐,我很幸福 |    35 | female   |      175 |       55 |
|  3 | 90/2/8     | Smith   | 无所谓开心还是难过              |    30 | male     |      175 |       70 |
|  4 | 93-1-5     | Henry   | 每天赚一万,真爽!              |    27 | male     |      185 |       80 |
|  5 | 1988/2/9   | William | 爽歪歪                        |    32 | male     |      177 |       76 |
|  6 | 1986-03-21 | Will    | 天气很凉爽,很舒服              |    34 | male     |      180 |       85 |
|  7 | 1984.06.9  | Qunique | 每天开心                      |    36 | female   |      168 |       62 |
|  8 | 1993.07.09 | Sara    | 难过悲伤                      |    27 | female   |      175 |       66 |
|  9 | 92/08/09   | Hillary | 美满幸福                      |    28 | male     |      190 |       85 |

g = 'female'
min_age = 25
min_height = 165

#筛选出年龄大于25岁,身高165以上, **且** 为女性的记录
df.query('(age > @min_age) & (height > @min_height) & (gender == @g)')

Run

|    | birthday   | name    | text                           |   age | gender   |   height |   weight |
|  0 | 1985/10/08 | Alice   | 我很开心,每天都这么快乐,我很幸福  |    35 | female   |      175 |       55 |
|  7 | 1984.06.9  | Qunique | 每天开心                        |    36 | female   |      168 |       62 |
|  8 | 1993.07.09 | Sara    | 难过悲伤                        |    27 | female   |      175 |       66 |


精选文章

管理世界 | 使用文本分析词构建并测量短视主义

管理世界 | 使用 「经营讨论与分析」 测量 「企业数字化指标」

支持开票 | Python实证指标构建与文本分析

PNAS | 文本网络分析&文化桥梁Python代码实现

PNAS | 使用语义距离测量一个人的「创新力(发散思维)得分

MS | 使用网络算法识别『创新的颠覆性与否

金融研究 | 文本相似度计算与可视化

金融研究 | 使用Python构建「关键审计事项信息含量」

视频分享 | 文本分析在经管研究中的应用

转载 | 金融学文本大数据挖掘方法与研究进展

文本分析 | 「MD&A信息含量」指标构建代码实现

可视化 | 绘制《三体》人物关系网络图

长期征稿 | 欢迎各位前来投稿

17G数据集 | 深交所企业社会责任报告

70G数据集 | 上市公司定期报告数据集

27G数据集 | 使用Python对27G招股说明书进行文本分析

数据集 | 585w企业工商注册信息

数据集 | 90w条中国上市「公司高管数据

可视化 | 绘制《三体》人物关系网络图

认知的测量 | 向量距离vs语义投影

Asent库 | 英文文本数据情感分析

tomotopy | 速度最快的LDA主题模型

100min视频 | Python文本分析与会计

安装python包出现报错:Microsoft Visual 14.0 or greater is required. 怎么办?

如何正确读入文本数据不乱码(解决文本乱码问题)

Faker库 | 生成实验数据

使用R语言绘制文本数据情感历时趋势图

NiceGUI库 | 简单易懂的Web GUI开发包;可开发数据标注工具、心理学实验工具等

CheatSheet | Python文本数据处理速查表

继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存