当前位置: 首页 > 科技观察

PandasQuery方法深度总结,你学会了吗?

时间:2023-03-18 16:01:15 科技观察

大多数Pandas用户都熟悉用于从PandasDataFrame中检索行和列的iloc[]和loc[]索引器方法。但是随着检索数据的规则变得越来越复杂,这些方法也变得越来越复杂和臃肿。同时,SQL也是我们经常接触和比较熟悉的语言,那么为什么不使用类似SQL的东西来查询我们的数据呢?事实证明,这实际上可以使用query()方法来完成。因此,在今天的文章中,我们将展示如何使用query()方法对数据框执行查询。为了获取数据,我们使用kaggle上的Titanic数据集作为本文的测试数据集。下载地址如下:https://www.kaggle.com/datasets/tedllh/titanic-train当然你也可以在文末下载。文末可以使用read_csv加载数据importpandasaspddf=pd.read_csv('titanic_train.csv')df数据集有891行12列:使用query()方法让我们找到列出所有从南安普顿('S')出发的乘客,可以使用方括号进行索引,代码如下:df[df['Embarked']=='S']如果使用query()方法,它看起来更好Neat: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('`EmbarkedOn`==@embarked')就地执行查询方法当使用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('Embarkedin("S","C")')查询结果如下:如果要查找不是从南安普敦('S')或瑟堡('C')出发的所有乘客,可以使用否定Pandas中的运算符(~):df[~((df['Embarked']=='S')|(df['Embarked']=='C'))]使用query()方法,只需使用notoperator:df.query('Embarkednotin("S","C")')以下输出显示从皇后镇出发的乘客('Q')和具有缺失值的乘客:说到缺失值,我们如何查询对于缺失值,当应用于列名时,我们可以使用isnull()方法来查找缺失值:df.query('Embarked.isnull()')现在将在Embarked列中显示具有缺失值的行:在事实上,可以直接在列名称上调用各种Series方法:df.query('Name.str.len()<20')#findpasseng姓名小于20个字符的乘客df.query(f'Ticket.str.startswith("A")')#查找机票以A开头的所有乘客比较数字列我们还可以轻松地比较数字列:df.query('Fare>50')以下输出显示票价大于50的所有行:比较多个列您还可以使用and、or和not运算符比较多个列,以下语句检索Faregreaterthan50andAllrowswithAgegreaterthan30:df.query('Fare>50andAge>30')下面是查询结果:queryindex通常当我们要根据索引值检索行时,您可以按如下方式使用loc[]索引器:df.loc[[1],:]#获取索引为1的行;作为数据帧返回但使用query()方法,使事情更直观:df.query('index==1')的结果如下:如果要检索索引值小于5的所有行:df.query('index<5')结果如下:我们还可以指定索引值的范围:df.query('6<=index<20')结果如下:比较多列我们可以还要比较列之间的值,例如下面的语句检索所有Parch值大于SibSp值的行:df.query('Parch>SibSp')结果如下:总结从上面的例子,我们可以看到query()方法使搜索行的语法更加自然和简洁。希望有兴趣的朋友多多练习,才能真正掌握!