Pandas 查詢數(shù)據(jù)
1. 前言
通過前面幾個小節(jié)的學(xué)習(xí),我們掌握了 Pandas 解析不同數(shù)據(jù)文件以及讀取 MySQL 數(shù)據(jù)庫的操作方法,接著分析了 Pandas 庫中兩個核心的數(shù)據(jù)結(jié)構(gòu) Series 和 DataFrame ,并掌握了他們常用的屬性和操作方法。
前幾節(jié)的學(xué)習(xí)讓我們獲取了數(shù)據(jù),并認(rèn)識了這些數(shù)據(jù)的特點(diǎn),從這節(jié)開始,我們將學(xué)習(xí)如何對這些數(shù)據(jù)做進(jìn)一步的處理。本節(jié)我們將學(xué)習(xí) Pandas 查詢數(shù)據(jù),根據(jù)我們需要的條件,對已有的數(shù)據(jù)做查詢操作。
2. 查詢方法概述
Pandas 在解析數(shù)據(jù)時,會根據(jù)一定的條件進(jìn)行解析處理,這種方式雖然在源數(shù)據(jù)上做了篩選,但實(shí)際的業(yè)務(wù)需求中,對解析出來的數(shù)據(jù),我們會根據(jù)更加明確的條件和需要,去查詢數(shù)據(jù)內(nèi)容,為進(jìn)一步的數(shù)據(jù)操作和分析做好鋪墊。Pandas 中提供了多種查詢函數(shù),方便我們的數(shù)據(jù)查詢操作,我們需要查詢的數(shù)據(jù)條件不同,所采用的操作也有所不同,總的來說,我們的查詢條件可以為按單個值查詢、按值列表查詢、按值區(qū)間查詢、按條件表達(dá)式查詢和按函數(shù)查詢五種查詢的方式,接下來我們將以 loc() 查詢函數(shù)為例,詳細(xì)講解每種查詢的具體操作。
Tips:loc() 的查詢條件,可以使用label值,也可以使用布爾值,他豐富的傳值方式,以及簡潔的使用方式,成為 Pandas 數(shù)據(jù)查詢較為常用的方法。
查詢方法 | 簡述 |
---|---|
loc( ) | 通過標(biāo)簽或布爾數(shù)字查詢數(shù)據(jù)集 (推薦使用的查詢方法) |
iloc( ) | 通過索引位來查詢數(shù)據(jù)集 |
query( ) | 通過布爾表達(dá)式查詢數(shù)據(jù)列 |
3. 查詢方法操作
這里我們通過解析 Excel 數(shù)據(jù)文件,獲得了數(shù)據(jù),具體數(shù)據(jù)解析內(nèi)容如下:
# 導(dǎo)入pandas包
import pandas as pd
# 指定導(dǎo)入的文件地址 默認(rèn)是file,這里的路徑中省略了 file:/
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 ---
編程語言 推出時間 價(jià)格 主要創(chuàng)始人
0 java 1995年 45.6 James Gosling
1 python 1991年 67.0 Guido van Rossum
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
4 php 2012年 69.9 Rasmus Lerdorf
5 C++ 1983年 75.0 Bjarne Stroustrup
輸出解析:可以看到解析后的數(shù)據(jù)結(jié)構(gòu)是 DataFrame 的二維數(shù)據(jù)表,有行索引和列索引,接下來我們將通過多種查詢方式,對該二維數(shù)據(jù)進(jìn)行查詢。
3.1 按單個值查詢
在 loc() 函數(shù)中按單個值查詢,我們的查詢條件參數(shù)傳入的是具體的單個 lable 值:
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[1])
# --- 輸出結(jié)果 ---
編程語言 python
推出時間 1991年
價(jià)格 67
主要創(chuàng)始人 Guido van Rossum
Name: 1, dtype: object
輸出解析: 這里可以看到 loc() 函數(shù)中,我們查詢的數(shù)據(jù)條件是行索引值等于1的數(shù)據(jù)集,通過查詢結(jié)果我們可以看到,輸出的是 Series 一維數(shù)據(jù)結(jié)構(gòu),他列索引的值是我們二維數(shù)據(jù)的列索引值內(nèi)容。
我們也可以查詢出具體的單個數(shù)據(jù)值,通過傳入兩個 Label 值進(jìn)行數(shù)據(jù)值的查詢。
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[1,"價(jià)格"])
# --- 輸出結(jié)果 ---
67.0 # 這里可以看到輸出結(jié)果為具體的數(shù)據(jù)項(xiàng)值
Tips:loc() 多個查詢值的傳遞,第一個參數(shù)選擇 index (行索引值,最左側(cè)一列),第二個參數(shù)選擇 column(列索引值,最上面一行),如果參數(shù)傳錯,查詢時匯報(bào)索引值查找錯誤。
如下面,我們將行索引和列索引的順序顛倒,則會報(bào)錯:
print(data.loc["價(jià)格",1])
# --- 輸出結(jié)果 ---
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-17-b625c01645c5> in <module>
----> 1 print(data.loc["價(jià)格",1])
……
……
KeyError: '價(jià)格'
3.2 按列表查詢
在 loc() 函數(shù)中,我們通過傳入要查詢的列表項(xiàng),可以查詢多個數(shù)據(jù)內(nèi)容,返回的數(shù)據(jù)結(jié)果是 Series 數(shù)據(jù)結(jié)構(gòu)或者 DataFrame 數(shù)據(jù)結(jié)構(gòu)。
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[[1,2,5],["編程語言","價(jià)格"]])
# --- 輸出結(jié)果 ---
編程語言 價(jià)格
1 python 67.0
2 C 33.9
5 C++ 75.0
輸出解析: 我們傳入兩個查詢列表 [1,2,5] 和 [“編程語言”,“價(jià)格”],可以看到查詢的結(jié)果為二維數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)集。
3.3 按區(qū)間查詢
按區(qū)間查詢主要用到了英文狀態(tài)下的冒號 “ : ” ,冒號左側(cè)是區(qū)間的開始位置,右側(cè)是結(jié)束位置。
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[0:5,["編程語言","價(jià)格"]])
# --- 輸出結(jié)果 ---
編程語言 價(jià)格
0 java 45.6
1 python 67.0
2 C 33.9
3 js 59.5
4 php 69.9
5 C++ 75.0
輸出解析: 這里的行索引我們傳入的是區(qū)間 0:5,從結(jié)果中可以看到數(shù)據(jù)內(nèi)容正是這5行的數(shù)據(jù),其中是包含區(qū)間兩端的值的。
這里的行索引和列索引都可以設(shè)置為區(qū)間查找:
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[3:5,"推出時間":"主要創(chuàng)始人"])
# --- 輸出結(jié)果 ---
推出時間 價(jià)格 主要創(chuàng)始人
3 1995年 59.5 Brendan Eich
4 2012年 69.9 Rasmus Lerdorf
5 1983年 75.0 Bjarne Stroustrup
輸出解析:通過設(shè)置區(qū)間為條件,可以看到查詢的結(jié)果正是對應(yīng)行索引和列索引所包含內(nèi)的是數(shù)據(jù)。
3.4 按條件查詢
按條件查詢是查詢數(shù)據(jù)符合一定條件的數(shù)據(jù)集,包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)等條件。
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[data["價(jià)格"]<60])
# --- 輸出結(jié)果 ---
編程語言 推出時間 價(jià)格 主要創(chuàng)始人
0 java 1995年 45.6 James Gosling
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
輸出解析:這里的查詢條件為價(jià)格小于60的數(shù)據(jù),可以看到結(jié)果查詢出了所有在價(jià)格上滿足該條件的數(shù)據(jù)。
Tips:注意條件等于,要用雙等于號 “ == ”,在程序中單個等于表示賦值,雙等于表示運(yùn)算。
除了單個條件,還可以傳入多個條件,并通過運(yùn)算符 &(與)表示兩邊條件都要滿足、| (或)表示兩邊條件有一個滿足就可以,進(jìn)行多條件組合查詢:
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[(data["價(jià)格"]<=69.9) & (data["推出時間"]=="1972年") ])
# --- 輸出結(jié)果 ---
編程語言 推出時間 價(jià)格 主要創(chuàng)始人
2 C 1972年 33.9 Dennis MacAlistair Ritchie
輸出解析:我們這里設(shè)置了兩個條件,一個是價(jià)格小于等于69.9,另一個是推出時間等于1972年,這兩個數(shù)據(jù)進(jìn)行與運(yùn)算,表示這兩個條件都滿足的數(shù)據(jù)。可以看到數(shù)據(jù)結(jié)果是同時滿足了這兩個條件的所有數(shù)據(jù)集。
3.5 按函數(shù)查詢
函數(shù)查詢是在查詢的參數(shù)中傳入函數(shù),查詢使該函數(shù)返回為 True 的數(shù)據(jù)集。
# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)
print(data.loc[data["推出時間"].isin(["1972年","1995年","1983年"])])
# --- 輸出結(jié)果 ---
編程語言 推出時間 價(jià)格 主要創(chuàng)始人
0 java 1995年 45.6 James Gosling
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js 1995年 59.5 Brendan Eich
5 C++ 1983年 75.0 Bjarne Stroustrup
輸出解析:這里我們傳入了一個函數(shù) isin( ) 該函數(shù)接受一個列表,判斷該列中元素是否在“推出時間 ”列表中 ,如果是就查詢出該數(shù)據(jù)集,從結(jié)果可以看出,查詢出了“推出時間”為1972年、1995年、1983年的數(shù)據(jù)集。當(dāng)然,我們除了可以使用 Pandas 自帶的一些函數(shù),我們也可以自定義一些條件函數(shù),傳入?yún)?shù)進(jìn)行查詢。
4.小結(jié)
本節(jié)課我們主要學(xué)習(xí)了對解析后的數(shù)據(jù),按照我們業(yè)務(wù)實(shí)際的需要進(jìn)行數(shù)據(jù)的查詢的方式,通過使用 loc() 查詢函數(shù),以及對應(yīng)的查詢參數(shù),可以很好的滿足我們數(shù)據(jù)的查詢需要。本節(jié)課程的重點(diǎn)如下:
- 掌握 loc() 數(shù)據(jù)查詢函數(shù)的使用方法;
- 掌握查詢條件的五種類別,結(jié)合實(shí)際業(yè)務(wù)需求進(jìn)行參數(shù)的傳入。
Tips:想要學(xué)習(xí)更多Pandas相關(guān)知識,可以點(diǎn)擊
Pandas 新增數(shù)據(jù)
Pandas 刪除數(shù)據(jù)
Pandas 修改數(shù)據(jù)