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