目录
1 索引器
1.1 表的列索引
- 基础用法:通过
[ ]
实现,通过[列名]
可以从DataFrame
中取出相应的列,返回值为Series
【例子】从表中取出姓名一列import pandas as pd import numpy as np df = pd.read_csv('data/learn_pandas.csv', usecols = ['School', 'Grade', 'Name', 'Gender', 'Weight', 'Transfer']) print(df['Name'].head())
0 Gaopeng Yang 1 Changqiang You 2 Mei Sun 3 Xiaojuan Sun 4 Gaojuan You Name: Name, dtype: object
- 取出多个列:通过
[列名组成的列表]
,其返回值为一个DataFrame
【例子】从表中取出性别和姓名两列print(df[['Gender', 'Name']].head())
Gender Name 0 Female Gaopeng Yang 1 Male Changqiang You 2 Male Mei Sun 3 Female Xiaojuan Sun 4 Male Gaojuan You
- 取出单列的另外方法:取出单列,且列名中不包含空格,则可以用
.列名
取出,这和[列名]
是等价的
df.Name.head()
1.2 序列的行索引
- 以字符串为索引:
- 语法:取出单个索引的对应元素,用
[item]
;取出多个用[items的列表]
;取出某两个索引之间的元素,且这两个索引是在整个索引中唯一出现,则可以使用切片。
注意:这里的切片会包含两个端点
- 用法:若
Series
只有单个值对应,则返回这个标量值,如果有多个值对应,则返回一个 Series。 - 【例子】
s = pd.Series([1, 2, 3, 4, 5, 6], index=['a', 'b', 'a', 'a', 'a', 'c']) print(s['a']) # 取出单个,多值对应 print(s['b']) # 取出单个,单值对应 print(s[['c', 'b']] # 取出多个索引的对应元素 print(s['c': 'b': -2]) # 切片
a 1 a 3 a 4 a 5 dtype: int64 2 c 6 b 2 dtype: int64 c 6 a 4 b 2 dtype: int64
- 语法:取出单个索引的对应元素,用
- 以整数为索引:
- 语法:使用 [int] 或 [int_list] ,则可以取出对应索引元素的值
- 用法:和字符串一样使用,特别的是,如果不特别指定所对应的列作为索引,那么会生成从0开始的整数索引作为默认索引。
注意:使用整数切片,同 Python 中的切片一样不包含右端点。
- 【例子】
s = pd.Series(['a', 'b', 'c', 'd', 'e', 'f'], index=[1, 3, 1, 2, 5, 4]) print(s[[2,3]]) print(s[1:-1:2]) # 整数切片
2 d 3 b dtype: object 3 b 2 d dtype: object
注意:不要把纯浮点以及任何混合类型(字符串、整数、浮点类型等的混合)作为索引,否则可能会在具体的操作时报错或者返回非预期的结果
1.3 loc索引器
-
行的索引器:一种是基于 元素 的
loc
索引器,另一种是基于 位置 的iloc
索引器。 -
loc索引器:
- 形式:一般形式是
loc[*, *]
,其中第一个*
代表行的选择
,第二个*
代表列的选择
,如果省略第二个位置写作loc[*]
,这个*
是指行的筛选。 *
参数对象:
1.单个元素 2.元素列表 3.元素切片 4.布尔列表 5.函数
- 形式:一般形式是
-
*
为单个元素:- 用法:直接取出相应的行或列,如果该元素在索引中重复则结果为
DataFrame
,否则为Series
- 【例子】
# 只选择行 print(df_demo.loc['Qiang Sun']) # 多个人叫此名字 print(df_demo.loc['Quan Zhao']) # 名字唯一
School Grade Gender Weight Transfer Name Qiang Sun Tsinghua University Junior Female 53.0 N Qiang Sun Tsinghua University Sophomore Female 40.0 N Qiang Sun Shanghai Jiao Tong University Junior Female NaN N School Shanghai Jiao Tong University Grade Junior Gender Female Weight 53 Transfer N Name: Quan Zhao, dtype: object
# 同时选择行和列 print(df_demo.loc['Qiang Sun', 'School') # 返回Series print(df_demo.loc['Quan Zhao', 'School']) # 返回单个元素
Name Qiang Sun Tsinghua University Qiang Sun Tsinghua University Qiang Sun Shanghai Jiao Tong University Name: School, dtype: object 'Shanghai Jiao Tong University'
- 用法:直接取出相应的行或列,如果该元素在索引中重复则结果为
-
*
为元素列表:- 【例子】 取出列表中所有元素值对应的行或列
df_demo.loc[['Qiang Sun','Quan Zhao'], ['School','Gender']]
School Gender Name Qiang Sun Tsinghua University Female Qiang Sun Tsinghua University Female Qiang Sun Shanghai Jiao Tong University Female Quan Zhao Shanghai Jiao Tong University Female
-
*
为元素切片:- 使用条件:必须是唯一值的起点和终点字符/数值
- 注意:字符串切片包含两个端点,整数切片只包含起点。
- 【例子】
# 字符串索引 print(df_demo.loc['Gaojuan You':'Gaoqiang Qian', 'School':'Gender']) # 整数索引 print(df_loc_slice_demo.loc[5:3])
School Grade Gender Name Gaojuan You Fudan University Sophomore Male Xiaoli Qian Tsinghua University Freshman Female Qiang Chu Shanghai Jiao Tong University Freshman Female Gaoqiang Qian Tsinghua University Junior Female School Grade Gender Weight Transfer 5 Fudan University Junior Female 46.0 N 4 Tsinghua University Senior Female 50.0 N 3 Shanghai Jiao Tong University Senior Female 45.0 N
-
*
为布尔列表:- 用法:传入
loc
的布尔列表与DataFrame
长度相同,且列表为True
的位置所对应的行会被选中,False
则会被剔除 - 【例子】选出体重超过70kg的学生
df_demo.loc[df_demo.Weight>70].head()
School Grade Gender Weight Transfer Name Mei Sun Shanghai Jiao Tong University Senior Male 89.0 N Gaojuan You Fudan University Sophomore Male 74.0 N Xiaopeng Zhou Shanghai Jiao Tong University Freshman Male 74.0 N Xiaofeng Sun Tsinghua University Senior Male 71.0 N Qiang Zheng Shanghai Jiao Tong University Senior Male 87.0 N
注意:对于复合条件,可以用
|(或)
,&(且)
,~(取反)
的组合来实现 - 用法:传入
-
*
为函数:- 使用条件:必须以前面的四种合法形式之一为返回值,并且函数的输入值为
DataFrame
本身 - 【例子1】可以把逻辑写入一个函数中再返回,需要注意的是函数的形式参数
x
本质上即为df_demo
。
''' 选出复旦大学中体重超过70kg的大四学生, 或者北大男生中体重超过80kg的非大四的学生 ''' def condition(x): ... ... return result df_demo.loc[condition]
School Grade Gender Weight Transfer Name Qiang Han Peking University Freshman Male 87.0 N Chengpeng Zhou Fudan University Senior Male 81.0 N Changpeng Zhao Peking University Freshman Male 83.0 N Chengpeng Qian Fudan University Senior Male 73.0 Y
- 【例子2】支持使用
lambda
表达式,其返回值也同样必须是先前提到的四种形式之一
df_demo.loc[lambda x:'Quan Zhao', lambda x:'Gender'] # 'Female'
- 【例子3】函数无法返回如
start: end: step
的切片形式,故返回切片时要用slice
对象进行包装
df_demo.loc[lambda x: slice('Gaojuan You', 'Gaoqiang Qian')] # 结果和*参数为切片的结果一样
- 使用条件:必须以前面的四种合法形式之一为返回值,并且函数的输入值为
注意:
1.对于Series
也可以使用loc
索引,其遵循的原则与DataFrame
中用于行筛选的loc[*]
完全一致
2.在对表或者序列赋值时,应当在使用一层索引器后直接进行赋值操作,这样做是由于进行多次索引后赋值是赋在临时返回的 copy 副本上的,而没有真正修改元素从而报出SettingWithCopyWarning
警告
1.4 iloc索引器
- 用法:iloc 的使用与 loc 完全类似,只不过是针对位置进行筛选,
- *参数:在相应的 * 位置处一共也有五类合法对象,分别是:整数、整数列表、整数切片、布尔列表以及函数(函数的返回值必须是前面的四类合法对象中的一个,其输入同样也为 DataFrame 本身)。
- 【例子】
# 整数 df_demo.iloc[1, 1] # 第二行第二列 # 'Freshman' # 整数列表 df_demo.iloc[[0, 1], [0, 1]] # 前两行前两列 ''' School Grade Name Gaopeng Yang Shanghai Jiao Tong University Freshman Changqiang You Peking University Freshman ''' # 整数切片 df_demo.iloc[1: 4, 2:4] # 切片不包含结束端点 ''' Gender Weight Name Changqiang You Male 70.0 Mei Sun Male 89.0 Xiaojuan Sun Female 41.0 ''' # 函数 df_demo.iloc[lambda x: slice(1, 4)] # 传入切片为返回值的函数 ''' School Grade Gender Weight Transfer Name Changqiang You Peking University Freshman Male 70.0 N Mei Sun Shanghai Jiao Tong University Senior Male 89.0 N Xiaojuan Sun Fudan University Sophomore Female 41.0 N '''
- 布尔列表:不能传入
Series
而必须传入序列的values
,否则会报错。因此,在使用布尔筛选的时候还是应当优先考虑 loc 的方式。
【例子】选出体重超过80kg的学生
df_demo.iloc[(df_demo.Weight>80).values].head()
School Grade Gender Weight Transfer Name Mei Sun Shanghai Jiao Tong University Senior Male 89.0 N Qiang Zheng Shanghai Jiao Tong University Senior Male 87.0 N Qiang Han Peking University Freshman Male 87.0 N Chengpeng Zhou Fudan University Senior Male 81.0 N Feng Han Shanghai Jiao Tong University Sophomore Male 82.0 N
- 布尔列表:不能传入
1.5 query方法
- 用法:在
pandas
中,支持把字符串形式的查询表达式传入query
方法来查询数据,其表达式的执行结果必须返回布尔列表。
1.6 随机抽样
- sample函数:如果把
DataFrame
的每一行看作一个样本,或把每一列看作一个特征,再把整个DataFrame
看作总体,想要对样本或特征进行随机抽样就可以用sample 函数
。- 主要参数:
n, axis, frac, replace, weights
,前三个分别是指抽样数量、抽样的方向(0为行、1为列)和抽样比例(0.3则为从总体中抽出30%的样本) replace 和 weights
分别是指是否放回和每个样本的抽样相对概率&#
- 主要参数: