Pandas Query 方法深度总结
作者 | 周萝卜
来源 | 萝卜大杂烩
iloc[]
和 loc[]
索引器方法,用于从 Pandas DataFrame 中检索行和列。但是随着检索数据的规则变得越来越复杂,这些方法也随之变得更加复杂而臃肿。事实证明实际上可以使用 query()
方法做到这一点。因此,在今天的文章中,我们将展示如何使用 query()
方法对数据框执行查询
获取数据
我们使用 kaggle 上的 Titanic 数据集作为本文章的测试数据集。
载入数据
import pandas as pd
df = pd.read_csv('titanic_train.csv')
df

使用 query() 方法
df[df['Embarked'] == 'S']
query()
方法,那么看起来更整洁:df.query('Embarked == "S"')
与 SQL 比较,则 query() 方法中的表达式类似于 SQL 中的 WHERE 语句。


embarked = 'S'
df.query('Embarked == @embarked')
df.query(f'Embarked == "{embarked}"')
就个人而言,我认为与 f-string 方式相比,使用 @ 字符更简单、更优雅,你认为呢
df.query('`Embarked On` == @embarked')
以 In-place 的方式执行 query 方法
df.query('Embarked == "S"', inplace=True)
query()
方法将不会返回任何值,原始 DataFrame 被修改。指定多个条件查询
df[(df['Embarked'] == 'S') | (df['Embarked'] == 'C')]
df.query('Embarked in ("S","C")')

df[~((df['Embarked'] == 'S') | (df['Embarked'] == 'C'))]
query()
方法,只需要使用 not 运算符:df.query('Embarked not in ("S","C")')

df.query('Embarked.isnull()')

df.query('Name.str.len() < 20') # find passengers whose name is
# less than 20 characters
df.query(f'Ticket.str.startswith("A")') # find all passengers whose
# ticket starts with A
比较数值列
df.query('Fare > 50')

比较多个列
df.query('Fare > 50 and Age > 30')

查询索引
loc[]
索引器,如下所示:df.loc[[1],:] # get the row whose index is 1; return as a dataframe
df.query('index==1')

df.query('index<5')

df.query('6 <= index < 20')

比较多列
df.query('Parch > SibSp')

总结
query()
方法使搜索行的语法更加自然简洁,希望感兴趣的小伙伴多加练习,真正的达到融会贯通的地步哦~
往期回顾 分享
点收藏
点点赞
点在看
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/