pandas之query方法和sample隨機(jī)抽樣操作
query方法
在 pandas 中,支持把字符串形式的查詢表達(dá)式傳入 query 方法來查詢數(shù)據(jù),其表達(dá)式的執(zhí)行結(jié)果必須返回布爾列表。在進(jìn)行復(fù)雜索引時(shí),由于這種檢索方式無需像普通方法一樣重復(fù)使用 DataFrame 的名字來引用列名,一般而言會使代碼長度在不降低可讀性的前提下有所減少。
例如
In [61]: df.query('((School == "Fudan University")&'
....: ' (Grade == "Senior")&'
....: ' (Weight > 70))|'
....: '((School == "Peking University")&'
....: ' (Grade != "Senior")&'
....: ' (Weight > 80))')
....:
Out[61]:
School Grade Name Gender Weight Transfer
38 Peking University Freshman Qiang Han Male 87.0 N
66 Fudan University Senior Chengpeng Zhou Male 81.0 N
99 Peking University Freshman Changpeng Zhao Male 83.0 N
131 Fudan University Senior Chengpeng Qian Male 73.0 Y
在 query 表達(dá)式中,幫用戶注冊了所有來自 DataFrame 的列名,所有屬于該 Series 的方法都可以被調(diào)用,和正常的函數(shù)調(diào)用并沒有區(qū)別,例如查詢體重超過均值的學(xué)生:
In [62]: df.query('Weight > Weight.mean()').head()
Out[62]:
School Grade Name Gender Weight Transfer
1 Peking University Freshman Changqiang You Male 70.0 N
2 Shanghai Jiao Tong University Senior Mei Sun Male 89.0 N
4 Fudan University Sophomore Gaojuan You Male 74.0 N
10 Shanghai Jiao Tong University Freshman Xiaopeng Zhou Male 74.0 N
14 Tsinghua University Senior Xiaomei Zhou Female 57.0 N
同時(shí),在 query 中還注冊了若干英語的字面用法,幫助提高可讀性,例如: or, and, or, is in, not in 。
例如,篩選出男生中不是大一大二的學(xué)生:
In [63]: df.query('(Grade not in ["Freshman", "Sophomore"]) and'
....: '(Gender == "Male")').head()
....:
Out[63]:
School Grade Name Gender Weight Transfer
2 Shanghai Jiao Tong University Senior Mei Sun Male 89.0 N
16 Tsinghua University Junior Xiaoqiang Qin Male 68.0 N
17 Tsinghua University Junior Peng Wang Male 65.0 N
18 Tsinghua University Senior Xiaofeng Sun Male 71.0 N
21 Shanghai Jiao Tong University Senior Xiaopeng Shen Male 62.0 NaN
此外,在字符串中出現(xiàn)與列表的比較時(shí), ==和!= 分別表示元素出現(xiàn)在列表和沒有出現(xiàn)在列表,等價(jià)于 is in 和 not in,例如查詢所有大三和大四的學(xué)生:
In [64]: df.query('Grade == ["Junior", "Senior"]').head()
Out[64]:
School Grade Name Gender Weight Transfer
2 Shanghai Jiao Tong University Senior Mei Sun Male 89.0 N
7 Tsinghua University Junior Gaoqiang Qian Female 50.0 N
9 Peking University Junior Juan Xu Female NaN N
11 Tsinghua University Junior Xiaoquan Lv Female 43.0 N
12 Shanghai Jiao Tong University Senior Peng You Female 48.0 NaN
對于 query 中的字符串,如果要引用外部變量,只需在變量名前加 @ 符號。例如,取出體重位于70kg到80kg之間的學(xué)生:
In [65]: low, high =70, 80
In [66]: df.query('Weight.between(@low, @high)').head()
Out[66]:
School Grade Name Gender Weight Transfer
1 Peking University Freshman Changqiang You Male 70.0 N
4 Fudan University Sophomore Gaojuan You Male 74.0 N
10 Shanghai Jiao Tong University Freshman Xiaopeng Zhou Male 74.0 N
18 Tsinghua University Senior Xiaofeng Sun Male 71.0 N
35 Peking University Freshman Gaoli Zhao Male 78.0 N
隨機(jī)抽樣
如果把 DataFrame 的每一行看作一個(gè)樣本,或把每一列看作一個(gè)特征,再把整個(gè) DataFrame 看作總體,想要對樣本或特征進(jìn)行隨機(jī)抽樣就可以用 sample 函數(shù)。有時(shí)在拿到大型數(shù)據(jù)集后,想要對統(tǒng)計(jì)特征進(jìn)行計(jì)算來了解數(shù)據(jù)的大致分布,但是這很費(fèi)時(shí)間。
同時(shí),由于許多統(tǒng)計(jì)特征在等概率不放回的簡單隨機(jī)抽樣條件下,是總體統(tǒng)計(jì)特征的無偏估計(jì),比如樣本均值和總體均值,那么就可以先從整張表中抽出一部分來做近似估計(jì)。
sample 函數(shù)中的主要參數(shù)為 n, axis, frac, replace, weights ,前三個(gè)分別是指抽樣數(shù)量、抽樣的方向(0為行、1為列)和抽樣比例(0.3則為從總體中抽出30%的樣本)。
replace 和 weights 分別是指是否放回和每個(gè)樣本的抽樣相對概率,當(dāng) replace = True 則表示有放回抽樣。例如,對下面構(gòu)造的 df_sample 以 value 值的相對大小為抽樣概率進(jìn)行有放回抽樣,抽樣數(shù)量為3。
In [67]: df_sample = pd.DataFrame({'id': list('abcde'),
....: 'value': [1, 2, 3, 4, 90]})
....:
In [68]: df_sample
Out[68]:
id value
0 a 1
1 b 2
2 c 3
3 d 4
4 e 90
In [69]: df_sample.sample(3, replace = True, weights = df_sample.value)
Out[69]:
id value
4 e 90
4 e 90
4 e 90
補(bǔ)充:pandas.DataFrame.sample 隨機(jī)選取若干行
1、數(shù)據(jù)切片選取
1.1 pandas.DataFrame.sample 隨機(jī)選取若干行
1.1.1 功能說明
有時(shí)候我們只需要數(shù)據(jù)集中的一部分,并不需要全部的數(shù)據(jù)。這個(gè)時(shí)候我們就要對數(shù)據(jù)集進(jìn)行隨機(jī)的抽樣。pandas中自帶有抽樣的方法。
功能相似:numpy.random.choice
Generates a random sample from a given 1-D numpy array.
1.1.2 使用說明
1.函數(shù)名及功能
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)[source]
2.輸入?yún)?shù)說明
| 參數(shù)名稱 | 參數(shù)說明 | 舉例說明 |
| n | 要抽取的行數(shù) |
df.sample(n=3,random_state=1) |
| frac |
抽取行的比例 |
df.sample(frac=0.8, replace=True, random_state=1) |
| replace |
是否為有放回抽樣, |
True:取行數(shù)據(jù)后,可以重復(fù)放回后再取 |
| weights |
字符索引或概率數(shù)組 axis=0:為行字符索引或概率數(shù)組 |
|
| random_state |
int: 隨機(jī)數(shù)發(fā)生器種子 |
random_state=None,取得數(shù)據(jù)不重復(fù) |
| axis |
選擇抽取數(shù)據(jù)的行還是列 |
也就是說axis=1時(shí),在列中隨機(jī)抽取n列,在axis=0時(shí),在行中隨機(jī)抽取n行。 |
3. 返回值說明
返回選擇的N行元素的DataFrame對象。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python編寫運(yùn)維進(jìn)程文件目錄操作實(shí)用腳本示例
這篇文章主要為大家介紹了Python編寫實(shí)用運(yùn)維進(jìn)程文件目錄的操作腳本示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例
本文主要介紹了Python實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
python中opencv實(shí)現(xiàn)圖片文本傾斜校正
圖片有的時(shí)候需要矯正,本文主要介紹了python中opencv實(shí)現(xiàn)圖片文本傾斜校正,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
python自動(dòng)化測試三部曲之unittest框架的實(shí)現(xiàn)
這篇文章主要介紹了python自動(dòng)化測試三部曲之unittest框架的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
python定時(shí)任務(wù)apscheduler的詳細(xì)使用教程
APScheduler的全稱是Advanced?Python?Scheduler,它是一個(gè)輕量級的?Python定時(shí)任務(wù)調(diào)度框架,下面這篇文章主要給大家介紹了關(guān)于python定時(shí)任務(wù)apscheduler的詳細(xì)使用教程,需要的朋友可以參考下2022-02-02
Django基礎(chǔ)CBV裝飾器和中間件的應(yīng)用示例
這篇文章主要為大家介紹了Django基礎(chǔ)CBV裝飾器和中間件的應(yīng)用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03

