query方法
在 pandas 中,支持把字符串形式的查詢表達式傳入 query 方法來查詢數據,其表達式的執行結果必須返回布爾列表。在進行復雜索引時,由于這種檢索方式無需像普通方法一樣重復使用 DataFrame 的名字來引用列名,一般而言會使代碼長度在不降低可讀性的前提下有所減少。
例如
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 表達式中,幫用戶注冊了所有來自 DataFrame 的列名,所有屬于該 Series 的方法都可以被調用,和正常的函數調用并沒有區別,例如查詢體重超過均值的學生:
1
2
3
4
5
6
7
8
|
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 |
同時,在 query 中還注冊了若干英語的字面用法,幫助提高可讀性,例如: or, and, or, is in, not in 。
例如,篩選出男生中不是大一大二的學生:
1
2
3
4
5
6
7
8
9
10
|
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 |
此外,在字符串中出現與列表的比較時, ==和!= 分別表示元素出現在列表和沒有出現在列表,等價于 is in 和 not in,例如查詢所有大三和大四的學生:
1
2
3
4
5
6
7
8
|
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之間的學生:
1
2
3
4
5
6
7
8
9
10
|
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 |
隨機抽樣
如果把 DataFrame 的每一行看作一個樣本,或把每一列看作一個特征,再把整個 DataFrame 看作總體,想要對樣本或特征進行隨機抽樣就可以用 sample 函數。有時在拿到大型數據集后,想要對統計特征進行計算來了解數據的大致分布,但是這很費時間。
同時,由于許多統計特征在等概率不放回的簡單隨機抽樣條件下,是總體統計特征的無偏估計,比如樣本均值和總體均值,那么就可以先從整張表中抽出一部分來做近似估計。
sample 函數中的主要參數為 n, axis, frac, replace, weights ,前三個分別是指抽樣數量、抽樣的方向(0為行、1為列)和抽樣比例(0.3則為從總體中抽出30%的樣本)。
replace 和 weights 分別是指是否放回和每個樣本的抽樣相對概率,當 replace = True 則表示有放回抽樣。例如,對下面構造的 df_sample 以 value 值的相對大小為抽樣概率進行有放回抽樣,抽樣數量為3。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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 |
補充:pandas.DataFrame.sample 隨機選取若干行
1、數據切片選取
1.1 pandas.DataFrame.sample 隨機選取若干行
1.1.1 功能說明
有時候我們只需要數據集中的一部分,并不需要全部的數據。這個時候我們就要對數據集進行隨機的抽樣。pandas中自帶有抽樣的方法。
功能相似:numpy.random.choice
1
|
Generates a random sample from a given 1 - D numpy array. |
1.1.2 使用說明
1.函數名及功能
1
|
DataFrame.sample(n = None , frac = None , replace = False , weights = None , random_state = None , axis = None )[source] |
2.輸入參數說明
參數名稱 | 參數說明 | 舉例說明 |
n | 要抽取的行數 |
df.sample(n=3,random_state=1) |
frac |
抽取行的比例 |
df.sample(frac=0.8, replace=True, random_state=1) |
replace |
是否為有放回抽樣, |
True:取行數據后,可以重復放回后再取 |
weights |
字符索引或概率數組
axis=0:為行字符索引或概率數組 |
|
random_state |
int: 隨機數發生器種子 |
random_state=None,取得數據不重復 |
axis |
選擇抽取數據的行還是列 |
也就是說axis=1時,在列中隨機抽取n列,在axis=0時,在行中隨機抽取n行。 |
3. 返回值說明
返回選擇的N行元素的DataFrame對象。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。
原文鏈接:https://blog.csdn.net/weixin_40426830/article/details/112209924