成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

整理了十個(gè)經(jīng)典的Pandas數(shù)據(jù)查詢案例!

開(kāi)發(fā) 后端
在本文中整理了10個(gè)示例,掌握著10個(gè)實(shí)例你就可以輕松的使用query函數(shù)來(lái)解決任何查詢的問(wèn)題。

大家好,我是豆芽

Pandas的query函數(shù)為我們提供了一種編寫(xiě)查詢過(guò)濾條件更簡(jiǎn)單的方法,特別是在的查詢條件很多的時(shí)候。

首先,將數(shù)據(jù)集導(dǎo)入Pandas

import pandas as pd
df = pd.read_csv("Dummy_Sales_Data_v1.csv")
df.head()

output

它是一個(gè)簡(jiǎn)單的9999 x 12數(shù)據(jù)集,是使用Faker創(chuàng)建的,我在最后也會(huì)提供本文的所有源代碼。

在開(kāi)始之前,先快速回顧一下Pandas中的查詢函數(shù)query。查詢函數(shù)用于根據(jù)指定的表達(dá)式提取記錄,并返回一個(gè)新的DataFrame。表達(dá)式是用字符串形式表示的條件或條件的組合。

PANDAS中的DATAFRAME(.loc和.iloc)屬性用于根據(jù)行和列標(biāo)簽和索引提取數(shù)據(jù)集的子集。因此,它并不具備查詢的靈活性。而括號(hào)符號(hào)[]可以靈活地基于條件過(guò)濾數(shù)據(jù)幀,但是如果條件很多的話編寫(xiě)代碼是繁瑣且容易出錯(cuò)的。

Pandas的query()函數(shù)可以靈活地根據(jù)一個(gè)或多個(gè)條件提取子集,這些條件被寫(xiě)成表達(dá)式并且不需要考慮括號(hào)的嵌套。

在后端Pandas使用eval()函數(shù)對(duì)該表達(dá)式進(jìn)行解析和求值,并返回表達(dá)式被求值為T(mén)RUE的數(shù)據(jù)子集或記錄。所以要過(guò)濾Pandas中的DataFrame,需要做的就是在查詢函數(shù)中指定條件即可。

使用單一條件進(jìn)行過(guò)濾

在單個(gè)條件下進(jìn)行過(guò)濾時(shí),在Query()函數(shù)中表達(dá)式僅包含一個(gè)條件。返回的輸出將包含該表達(dá)式評(píng)估為真的所有行。

示例1

提取數(shù)量為95的所有行,因此邏輯形式中的條件可以寫(xiě)為

Quantity == 95

需要將條件寫(xiě)成字符串,即將其包裝在雙引號(hào)“”中。query函數(shù)的代碼如下

df.query("Quantity == 95")

output

看起來(lái)很簡(jiǎn)單。它返回了數(shù)量為95的所有行。如果用一般查詢的方式可以寫(xiě)成:

df [df [“Quantity”] == 95]

但是,如果想在同一列中再包含一個(gè)條件怎么辦?

它在括號(hào)符號(hào)中又增加了一對(duì)方括號(hào),如果是3個(gè)條件或者更多條件呢?那么他就變得難以管理。這就是query函數(shù)的優(yōu)勢(shì)了。

在多個(gè)條件過(guò)濾

一個(gè)或多個(gè)條件下過(guò)濾,query()的語(yǔ)法都保持不變

但是需要指定兩個(gè)或多個(gè)條件進(jìn)行過(guò)濾的方式

  •  and:回在滿足兩個(gè)條件的所有記錄
  •  or:返回滿足任意條件的所有記錄

示例2

查詢數(shù)量為95&單位價(jià)格為182 ,這里包含單價(jià)的列被稱為UnitPrice(USD),因此,條件是

Quantity == 95
UnitPrice(USD) == 182

那么代碼就是:

df.query("Quantity == 95 and UnitPrice(USD) == 182")

這個(gè)查詢會(huì)報(bào)錯(cuò):

但是為什么報(bào)錯(cuò)?

這是因?yàn)閝uery()函數(shù)對(duì)列名有一些限制。列名稱UnitPrice(USD)是無(wú)效的。我們要使用反引號(hào)把列名包含起來(lái)。

df.query("Quantity == 95 and `UnitPrice(USD)` == 182")

output

當(dāng)兩個(gè)條件滿足時(shí),只有3個(gè)記錄。

或者我們直接將列名改成合理的格式:

df.rename(columns={'UnitPrice(USD)':'UnitPrice',
'Shipping_Cost(USD)':'Shipping_Cost',
'Delivery_Time(Days)':'Delivery_Time'},
inplace=True)

這里就不需要使用反引號(hào)了:

df.query("Quantity == 95 and UnitPrice == 182")

示例3

我們現(xiàn)在只需要滿足一個(gè)條件:

df.query("Quantity == 95 or UnitPrice == 182")

output

它返回滿足兩個(gè)條件中的任意一個(gè)條件的所有列。

我們也可以使用|替代or關(guān)鍵字。

示例4

假設(shè)想獲得數(shù)量不等于95的所有行。最簡(jiǎn)單的答案是在條件之前使用not關(guān)鍵字或否定操作符?

df.query("not(Quantity == 95)")

output

結(jié)果它包含數(shù)量不是95的所有行。

其實(shí)這里的條件不一定必須是相等運(yùn)算符,可以從==,!=,>,<,≥,≤中選擇,例如:

df.query("Quantity != 95")

文本過(guò)濾

對(duì)于文本列過(guò)濾時(shí),條件是列名與字符串進(jìn)行比較。

請(qǐng)query()表達(dá)式已經(jīng)是字符串。那么如何在另一個(gè)字符串中寫(xiě)一個(gè)字符串?將文本值包裝在單個(gè)引號(hào)“”中,就可以了。

示例5

想獲得即狀態(tài)“未發(fā)貨”所有記錄,可以在query()表達(dá)式中寫(xiě)成如下的形式:

df.query("Status == 'Not Shipped'")

output

它返回所有記錄,其中狀態(tài)列包含值-“未發(fā)貨”。

與數(shù)值的類似可以在同一列或不同列上使用多個(gè)條件,并且可以是數(shù)值和非數(shù)值列上條件的組合。

除此以外, Pandas中的query()方法還可以在查詢表達(dá)式中使用數(shù)學(xué)計(jì)算。

查詢中的簡(jiǎn)單數(shù)學(xué)計(jì)算

數(shù)學(xué)操作可以是列中的加,減,乘,除,甚至是列中值或者平方等,如下所示:

示例6

df.query("Shipping_Cost*2 < 50")

雖然這個(gè)二次方的操作沒(méi)有任何的實(shí)際意義,但是我們的示例返回了所有達(dá)到要求的行。

我們還可以在一個(gè)或多個(gè)列上包含一些復(fù)雜的計(jì)算。

示例7

我們隨便寫(xiě)一個(gè)比較復(fù)雜的公式:

df.query("Quantity**2 + Shipping_Cost**2 < 500")

output

如果使用最原始的[]的形式,這個(gè)公式的查詢基本上沒(méi)法完成,但是使用query()函數(shù)則變?yōu)楹?jiǎn)單的多。

除了數(shù)學(xué)操作,還在查詢表達(dá)式中使用內(nèi)置函數(shù)。

查詢中的內(nèi)置函數(shù)

Python內(nèi)置函數(shù),例如sort(),abs(),factorial(),exp()等,也可以在查詢表達(dá)式中使用。

示例8

查找單位價(jià)格平方根的超過(guò)15的行:

df.query("sqrt(UnitPrice) > 15")

output

query()函數(shù)還可以在同一查詢表達(dá)式將函數(shù)和數(shù)學(xué)運(yùn)算整合使用

示例9

df.query("sqrt(UnitPrice) < Shipping_Cost/2")

output

到目前為止,所有查詢示例都是關(guān)于數(shù)值和文本列的。但是,query()的還不僅限于這些數(shù)據(jù)類型,對(duì)于日期時(shí)間值query()函數(shù)也可以非常靈活的過(guò)濾。

日期時(shí)間列過(guò)濾

使用query()函數(shù)在日期時(shí)間值上進(jìn)行查詢的唯一要求是,包含這些值的列應(yīng)為數(shù)據(jù)類型dateTime64 [ns]

在示例數(shù)據(jù)中,OrderDate列是日期時(shí)間,但是我們的df其解析為字符串,所以我們需要先進(jìn)行轉(zhuǎn)換:

df["OrderDate"] = pd.to_datetime(df["OrderDate"], format="%Y-%m-%d")

為了提取有關(guān)日期的有用信息并在query()需要使用dt提取器,dt是一種訪問(wèn)對(duì)象,用于提取日期時(shí)間,例如DateTime系列的屬性。

示例10

獲得八月份的所有記錄

df.query("OrderDate.dt.month == 8")

output

所有記錄都是八月份的。OrderDate.dt.month顯示了如何使用dt訪問(wèn)者僅提取整個(gè)日期值的月份值。

如果提取2021年8月訂購(gòu)日為15或以上的所有訂單,可以寫(xiě)成這樣

df.query("OrderDate.dt.month == 8 and OrderDate.dt.year == 2021 and OrderDate.dt.day >=15")

output

dt很好用并且可以在同一列上結(jié)合了多個(gè)條件,但表達(dá)式似乎太長(zhǎng)了。所以可以通過(guò)編寫(xiě)更非常簡(jiǎn)單的表達(dá)式來(lái)過(guò)濾:

df.query("OrderDate >= '2021-08-15' and OrderDate <= '2021-08-31'")

我們直接傳遞一個(gè)符合日期格式的字符串,它會(huì)自動(dòng)的轉(zhuǎn)換并且比較:

將上面的所有內(nèi)容整合:

df.query("OrderDate >= '2021-08-15' and OrderDate <= '2021-08-31' and Status =
= 'Delivered'")

output

查詢表達(dá)式包含了日期時(shí)間和文本列條件,它返回了符合查詢表達(dá)式的所有記錄

替換

上面的查詢中都會(huì)生成一個(gè)新的df。這是因?yàn)椋簈uery()的第二個(gè)參數(shù)(inplace)默認(rèn)false。

與一般的Pandas提供的函數(shù)一樣,inplace的默認(rèn)值都是false,查詢不會(huì)修改原始數(shù)據(jù)集。如果我們想覆蓋原始df時(shí),需要將inplace=true。但是一定要小心使用inplace=true,因?yàn)樗鼤?huì)覆蓋原始的數(shù)據(jù)。

總結(jié)

我希望在閱讀本文后,您可以更頻繁,流利地使用Pandas中的query()函數(shù),因?yàn)樗梢苑奖阋赃^(guò)濾數(shù)據(jù)集。這些查詢的函數(shù)我每天都會(huì)或多或少的使用。

責(zé)任編輯:龐桂玉 來(lái)源: 數(shù)據(jù)查詢
相關(guān)推薦

2025-03-27 10:03:17

PythonPandas代碼

2024-05-13 11:43:39

Python數(shù)據(jù)分析CSV

2023-03-24 16:41:36

Pandas技巧數(shù)據(jù)處理

2024-08-26 14:57:36

2010-09-08 14:35:22

CSS

2022-10-19 15:20:58

pandas數(shù)據(jù)處理庫(kù)技巧

2024-05-30 12:27:42

Python代碼

2022-01-13 11:50:57

Python技巧代碼

2025-04-16 08:10:00

PandasPython數(shù)據(jù)分析

2011-05-31 17:13:29

SEO

2019-08-29 19:44:17

深度學(xué)習(xí)機(jī)器學(xué)習(xí)人工智能

2024-06-28 11:29:20

數(shù)據(jù)學(xué)習(xí)模型機(jī)器學(xué)習(xí)

2024-11-11 07:00:00

Python圖像識(shí)別

2024-06-11 08:52:58

2023-10-07 11:36:15

2025-05-26 02:22:00

2024-01-18 11:39:42

供應(yīng)鏈數(shù)字化轉(zhuǎn)型企業(yè)

2017-09-01 09:52:20

PythonPandas數(shù)據(jù)分析

2024-11-11 08:11:39

2021-04-09 23:00:12

SQL數(shù)據(jù)庫(kù)Pandas
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 美女久久久久 | 欧美日韩一区在线播放 | 国产精品日韩高清伦字幕搜索 | 日韩av电影院 | 日韩区| www.一区二区 | 日韩一区二区三区四区五区 | 亚洲不卡一 | 日本免费一区二区三区 | 天天操夜夜看 | 日本精品免费 | www国产亚洲精品久久网站 | 欧美激情免费在线 | 精品久久久久久亚洲精品 | 久久久999国产精品 中文字幕在线精品 | 亚洲欧美激情精品一区二区 | 911影院 | 伊人精品久久久久77777 | 国内精品久久久久久 | 韩日精品一区 | 成人一区二区三区在线观看 | 夜夜草 | 三级av在线 | 亚洲精品一二三区 | 日本午夜在线视频 | av在线一区二区三区 | 中文字幕高清av | 久久久久久免费毛片精品 | 欧美日韩亚洲视频 | 国产精品久久国产精品 | 国产一区二区三区免费观看在线 | 日韩精品在线视频免费观看 | 国产日韩欧美 | 成人毛片视频免费 | 日本淫视频 | 国产一二区免费视频 | 国产一级网站 | 国产农村一级国产农村 | 久久综合色综合 | 午夜精品一区二区三区在线视频 | 欧美啊v在线观看 |