大家好,我是豆芽菜。Pandas的查询功能为我们提供了一种更简单的查询过滤条件的编写方式,尤其是在查询条件较多的情况下。首先,将数据集导入Pandasimportpandasaspddf=pd.read_csv("Dummy_Sales_Data_v1.csv")df.head()output是一个使用Faker创建的简单的9999x12数据集,我也会在最后提供所有源代码对于这篇文章。在我们开始之前,快速回顾一下Pandas中的查询函数查询。查询函数用于根据指定的表达式提取记录并返回一个新的DataFrame。表达式是以字符串形式表示的条件或条件组合。PANDAS中的DATAFRAME(.loc和.iloc)属性用于根据行列标签和索引提取数据集的子集。因此,它不具备查询的灵活性。中括号[]可以灵活的根据条件过滤数据帧,但是条件多的话写代码比较麻烦,容易出错。Pandas的query()函数可以根据一个或多个条件灵活提取子集,写成表达式,不需要考虑括号的嵌套。在后端,Pandas使用eval()函数对表达式进行解析和求值,返回表达式求值为TRUE的数据子集或记录。所以在Pandas中过滤DataFrame,只需要在查询函数中指定条件即可。单一条件过滤单一条件过滤时,Query()函数中的表达式只包含一个条件。返回的输出将包含此表达式计算结果为真的所有行。例1提取了所有数量为95的行,所以逻辑形式的条件可以写成Quantity==95条件需要写成字符串,即用双引号""包起来。查询函数的代码如下df.query("Quantity==95")输出看起来很简单。它返回了所有数量为95的行。如果您使用一般查询,它可以写成:df[df["Quantity"]==95]但是如果您想在同一列中包含另一个条件怎么办?它在括号符号中添加了另一对方括号,如果是3个条件或更多条件怎么办?然后他变得难以控制。这就是查询功能的优势。多条件下过滤过滤一个或多个条件,query()的语法不变,但需要指定两个或多个条件进行过滤:返回满足两个条件的所有记录或:返回满足所有记录withanyconditionExample2Queryquantityis95&unitpriceis182,此处包含单价的列称为UnitPrice(USD),因此,条件为Quantity==95UnitPrice(USD)==182那么代码为:df.query("Quantity==95andUnitPrice(USD)==182")这个query会报错:但是为什么会报错呢?这是因为query()函数对列名有一些限制。列名称UnitPrice(USD)无效。我们将用反引号将列名括起来。df.query("Quantity==95and`UnitPrice(USD)`==182")output当两个条件都满足时,只有3条记录。或者我们直接把列名改成合理的格式:df.rename(columns={'UnitPrice(USD)':'UnitPrice','Shipping_Cost(USD)':'Shipping_Cost','Delivery_Time(Days)':'Delivery_Time'},inplace=True)这里不用反引号:df.query("Quantity==95andUnitPrice==182")例3我们现在只需要满足一个条件:df.query("Quantity==95orUnitPrice==182")输出返回满足两个条件之一的所有列。我们也可以使用|而不是or关键字。例4假设要获取所有数量不等于95的行,最简单的答案是在条件前使用not关键字或否定运算符~df.query("not(Quantity==95)")输出结果它包含所有数量不为95的行。其实这里的条件不一定非得是相等运算符,可以选择==、!=、>、<、≥、≤,例如:df.query("Quantity!=95")文本过滤对于文本列过滤,条件是列名与字符串进行比较。请查询()表达式已经是一个字符串。那么如何在另一个字符串中写入一个字符串呢?将文本值用单引号""括起来,就可以了。示例5如果要获取状态为“NotShipped”的所有记录,可以在query()表达式中编写以下形式:df.query("Status=='NotShipped'")output返回所有记录,其中状态列包含值-“未发货”。与数值类似,多个条件可以在同一列或不同列上使用,并且可以是数值和非数值列的条件组合。此外,Pandas中的query()方法还可以在查询表达式中使用数学计算。查询中的简单数学计算数学运算可以是列中的加减乘除,甚至可以是列的中位数或平方,如下图:例子6df.query("Shipping_Cost*2<50")虽然这两个幂运算没有任何实际意义,但是我们的示例返回了所有满足要求的行。我们还可以在一列或多列上包含一些复杂的计算。例7写一个比较复杂的公式:df.query("Quantity**2+Shipping_Cost**2<500")output如果使用最原始的[]形式,这个公式的查询基本完成不了。但是使用query()函数变得简单多了。除了数学运算之外,查询表达式中还使用了内置函数。查询中的内置函数Python内置函数,如sort()、abs()、factorial()、exp()等,也可以在查询表达式中使用。示例8查找单价平方根超过15的行:df.query("sqrt(UnitPrice)>15")outputquery()函数还可以将函数和数学运算组合在同一个查询表达式中示例9df.query(“sqrt(UnitPrice)
