关于程序员:Pandas-Query-方法深度总结

38次阅读

共计 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 多平台公布

正文完
 0