共计 2298 个字符,预计需要花费 6 分钟才能阅读完成。
大多数 Pandas 用户都相熟 iloc[]
和 loc[]
索引器办法,用于从 Pandas DataFrame 中检索行和列。然而随着检索数据的规定变得越来越简单,这些办法也随之变得更加简单而臃肿。
同时 SQL 也是咱们常常接触且较为相熟的语言,那么为什么不应用相似于 SQL 的货色来查问咱们的数据呢
事实证明实际上能够应用 query()
办法做到这一点。因而,在明天的文章中,咱们将展现如何应用 query()
办法对数据框执行查问
获取数据
咱们应用 kaggle 上的 Titanic 数据集作为本文章的测试数据集,下载地址如下:
https://www.kaggle.com/datase…
当然也能够在文末获取到萝卜哥下载好的数据集
载入数据
上面文末就能够应用 read_csv 来载入数据了
import pandas as pd
df = pd.read_csv('titanic_train.csv')
df
数据集有 891 行和 12 列:
应用 query() 办法
让咱们找出从南安普敦 (‘S’) 登程的所有乘客,能够应用方括号索引,代码如下所示:
df[df['Embarked'] == 'S']
如果应用 query()
办法,那么看起来更整洁:
df.query('Embarked =="S"')
与 SQL 比拟,则 query() 办法中的表达式相似于 SQL 中的 WHERE 语句。
后果是一个 DataFrame,其中蕴含所有从南安普敦登程的乘客:
query() 办法承受字符串作为查问条件串,因而,如果要查问字符串列,则须要确保字符串被正确括起来:
很多时候,咱们可能心愿将变量值传递到查问字符串中,能够应用 @ 字符执行此操作:
embarked = 'S'
df.query('Embarked == @embarked')
或者也能够应用 f 字符串,如下所示:
df.query(f'Embarked =="{embarked}"')
就集体而言,我认为与 f-string 形式相比,应用 @ 字符更简略、更优雅,你认为呢
如果列名中有空格,能够应用反引号 (\`\`) 将列名括起来:
df.query('`Embarked On` == @embarked')
以 In-place 的形式执行 query 办法
当应用 query() 办法执行查问时,该办法将后果作为 DataFrame 返回,原始 DataFrame 放弃不变。如果要更新原始 DataFrame,须要应用 inplace 参数,如下所示:
df.query('Embarked =="S"', inplace=True)
当 inplace 设置为 True 时,query()
办法将不会返回任何值,原始 DataFrame 被批改。
指定多个条件查问
咱们能够在查问中指定多个条件,例如假如我想获取所有从南安普敦 (‘S’) 或瑟堡 (‘C’) 登程的乘客。如果应用方括号索引,这种语法很快变得十分蠢笨:
df[(df['Embarked'] == 'S') | (df['Embarked'] == 'C')]
咱们留神到,在这里咱们须要在查问的条件下援用 DataFrame 两次,而应用 query() 办法,就简洁多了:
df.query('Embarked in ("S","C")')
查问后果如下
如果要查找所有不是从南安普敦(‘S’)或瑟堡(‘C’)登程的乘客,能够在 Pandas 中应用否定运算符 (~):
df[~((df['Embarked'] == 'S') | (df['Embarked'] == 'C'))]
应用 query()
办法,只须要应用 not 运算符:
df.query('Embarked not in ("S","C")')
以下输入显示了从皇后镇 (‘Q’) 登程的乘客以及缺失值的乘客:
说到缺失值,该怎么查问缺失值呢,当利用于列名时,咱们能够应用 isnull() 办法查找缺失值:
df.query('Embarked.isnull()')
当初将显示 Embarked 列中短少值的行:
其实能够间接在列名上调用各种 Series 办法:
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')
以下输入显示了票价大于 50 的所有行:
比拟多个列
还能够应用 and、or 和 not 运算符比拟多个列,以下语句检索 Fare 大于 50 和 Age 大于 30 的所有行:
df.query('Fare > 50 and Age > 30')
上面是查问后果
查问索引
通常当咱们想依据索引值检索行时,能够应用 loc[]
索引器,如下所示:
df.loc[[1],:] # get the row whose index is 1; return as a dataframe
然而应用 query() 办法,使得事件变得更加直观:
df.query('index==1')
后果如下
如果要检索索引值小于 5 的所有行:
df.query('index<5')
后果如下
咱们还能够指定索引值的范畴:
df.query('6 <= index < 20')
后果如下
比拟多列
咱们还能够比拟列之间的值,例如以下语句检索 Parch 值大于 SibSp 值的所有行:
df.query('Parch > SibSp')
后果如下
总结
从下面的示例能够看出,query()
办法使搜寻行的语法更加天然简洁,心愿感兴趣的小伙伴多加练习,真正的达到死记硬背的境地哦~
好啦,这就是明天分享的全部内容,喜爱就点个赞吧~
本文由 mdnice 多平台公布