Pandas 以 Numpy 为基础,借力 Numpy 模块在计算方面性能高的优势;其次,Pandas 基于 Matplotlib,能够简便的画图;Pandas 还具有独特的数据结构
Pandas 具有便捷的数据处理能力,例如上一节 三、Python数据挖掘(Numpy库)中我们知道了,通过 Numpy 的 genfromtxt() 函数读取数据文件中的字符串时,会出现 nan 的情况,但 Pandas 解决了这些问题,具有便捷的数据处理能力,读取文件方便,并且封装了 Matplotlib 和 Numpy 的画图和计算
对于 Numpy 中的 ndarray,它只储存数据,但不包含数据的意义,而 DataFrame 的结构上,既有行索引,又有列索引的二维数组
可以类比于 SQL 中的一张关系表:一般 DataFrame 中行索引是指不同的事物,而列索引是指事物的属性(重要)
Pandas 一般会和 Numpy 配合着来使用
导入模块:
import pandas as pd
pd.DataFrame(data, index, columns, dtype=None, copy=False)
返回 二维数组data 的 DataFrame 结构
index 行索引语句,数组
columns 列索引语句,数组
注:只返回新数组,不改变原数组
pd.DataFrame(dict)
以字典的方式创建 DataFrame 数组
字典 key值 作为列索引
Pandas 中的特殊索引——时间序列:
pd.date_range(start=, end=, periods=, freq=, closed=None)
生成一个固定间隔时间的时间序列,可以用作 DataFrame 的索引
start= 开始日期,格式为:“2021-01-01”(不含时间)或 “2021-01-01 00:00:00”(含时间)
end= 结束日期,格式和 start= 一致
periods= 生成的时间序列的个数
freq= 频率,即时间间隔
closed= 把原输出结果输出为开/闭区间:
“closed=left” 表示输出区间为左闭右开
“closed=right” 表示输出区间为左开右闭
freq 频率 | 含义 |
---|---|
D | 一天 |
W | 一周 |
W-SUN | 一周,以星期天为起始,等同于"W" |
W-MON | 一周,以星期一为起始 |
W-TUE | 一周,以星期二为起始 |
W-WED | 一周,以星期三为起始 |
W-THU | 一周,以星期四为起始 |
W-FRI | 一周,以星期五为起始 |
W-SAT | 一周,以星期六为起始 |
M | 一个月,以月结束为界,如:“2018-11-30”, “2018-12-31” |
MS | 一个月,以月起始为界,如:“2021-01-01”, “2021-02-01” |
S | 一秒 |
T/min | 一分钟 |
H | 一个小时 |
A/Y | 一年,以年结束为界,如:“2020-12-31” |
更详细的内容,可参考下述文章:
new_ = pd.to_datetime(datetime_list)
专门处理时间序列的函数,传入一个时间序列的列表,返回一个新的对象
datetime_list 时间序列列表
新对象的属性 | 含义 |
---|---|
month | 时间序列列表的月份列表 |
year | 时间序列列表的年份列表 |
weekday | 时间序列列表的星期列表 |
day | 时间序列列表的日份列表 |
属性 | 含义 |
---|---|
shape | 形状 |
index | 行索引 |
columns | 列索引 |
values | 表格内容-值 |
由于这些属性都是由数组构成,因此也可以进行一些访问操作
访问行索引:
DataFrame数组.index[下标/start:stop]
访问行索引,缺省时访问所有行索引
注:DataFrame 规定,不能直接通过 DataFrame数组.index[下标] = 值 单独修改某一行索引,只能整体修改
DataFrame数组.columns[下标/start:stop]
访问列索引,缺省时访问所有列索引
注:DataFrame 规定,不能直接通过 DataFrame数组.columns[下标] = 值 单独修改某一列索引,只能整体修改
new_ = DataFrame数组.reset_index(drop=False)
DataFrame 将生成新的数字顺序的行索引
drop= 决定是否删除原索引,如果 drop=False,则不删除原索引,会把原行索引加到第一列中
注:只返回新数组 new_ ,不改变原数组
new_ = DataFrame数组.set_index(keys, drop=True)
以某列的值设置为新的索引,key为某列的索引
keys 索引,可以设置多个索引
drop 决定是否删除作为索引引用后的该列:
drop=Fales 当设置了某列的值为新的索引后,保留这一列
drop=True 当设置了某列的值为新的索引后,不保留这一列,即 列数-1
注:只返回新数组 new_ ,不改变原数组
DataFrame数组.T
同样可以实现行和列的转置
DataFrame数组.head([num])
返回 DataFrame 数组前 num 行的内容
num 可以指定行数,默认为5行DataFrame数组.tail([num])
返回 DataFrame 数组后 num 行的内容
num 可以指定行数,默认为5行
访问某一行整行、某一整列或部分数据:
DataFrame数组.iloc[行下标/start:stop[, start:stop]]
用于访问 DataFrrame 中所选的数据
行下标/start:stop 可以是指 行下标 所索引的行,也可以是某些行 [start:stop)
[start:stop) 列的范围,缺省时为所有列,这个不能是下标,但是可以通过如:[0:1] 的方式来单独访问某一列
后面会作更详细的介绍
MultiIndex 与 Panel:
MultiIndex 就是多层或分层索引对象,简单来说,在 DataFrame 具有多列行索引时, MultiIndex 就是多列行索引对象
例:通过 index.索引的名字 可以访问指定索引
DataFrame数组.index.levels
显示行索引的内容
Panel 是用于存储三维数组的结构,其大致结构类似于 DataFrame
通常会把 Pnael 当作 DataFrame(数据帧) 的容器
pd.Panel(data, items, major_axis, minor_axis, copy=False, dtype=None)
返回 三维数组data 的 Panel 结构
data 三维数组
items - axis 0 每个项目对应于内部包含的数据帧(DataFrame)
major_axis - axis 1 它是每个数据帧(DataFrame)的行索引
minor_axis - axis 2 它是每个数据帧(DataFrame)的列
注:只返回新数组 new_ ,不改变原数组
Series 可以是 DataFrame 中的某一行,视为一维数组
它包含 索引index (0, 1, 2, 3…) 和 值value 属性,这里的 index 指的是 Series的列索引——即一维数组的索引,而不是 DataFrame 的行索引
可以把 DataFrame 理解为 Series 的容器
属性 | 含义 |
---|---|
index | 索引 |
values | 值 |
pd.Series(data, index)
返回 一维数组data 的 Series 结构
data 一维数组
index 索引语句,数组
例:
DataFrame数组[column][index]
通过 列和行 的索引访问 DataFrame 中的值
column 列索引,可以是一个数组
index 行索引,可以是一个数组,可以缺省
注:当 column 是一个数组时,index 不能指定任何值(重要)
注:[ ][ ] 是先列后行,不是先行后列DataFrame数组[start:stop]
读取下标在区间 [start, stop) 内的行,无法指定列
例:
索引到某一值:
访问整列数据:
通过数组访问某些组合的数据:
DataFrame数组.loc[index][column]
DataFrame数组.loc[index, column]通过 行和列 的索引访问 DataFrame 中的值,上述两种方法效果一样,都可以
index 行索引,可以是一个数组
column 列索引,可以是一个数组
loc() 不会受到直接访问那样的限制
例:
DataFrame数组.iloc[行下标/start:stop[, start:stop]]
用于访问 DataFrrame 中所选的数据
行下标/start:stop 可以是指 行下标 所索引的行,也可以是某些行 start:stop
start:stop 列的范围,缺省时为所有列,这个不能是下标
例:
当列索引是以字母为开头时,列索引就是该 DataFrame/Series数组 的属性,可以用访问属性的方法来访问列
可以进行整体赋值,也可以单独赋值:
访问需要修改的值 = 值
可以实现整体赋值或单独赋值
例:
注:这个方法还可以为 DataFrame/Series数组 增加新的行或列
排序有两种形式,一种是根据内容进行排序,一种是根据行索引进行排序
DataFrame数组.sort_values(by=, ascending=True)
取单个列或多个列,根据这些列的内容进行排序
by 可以是某个列的索引,也可以是多个列的索引,以索引选取的列作为排序依据,如:by=[“Chinese”, “Math”],则优先根据 Chinese 索引进行排序,若 Chinese 索引值有相等项时,再根据 Math 索引
ascending=False 降序排序
ascending=True 升序排序,默认
注:只返回新数组,不改变原数组DataFrame数组.sort_index()
根据行索引进行排序
注:只返回新数组,不改变原数组
由于 Series 是一个一维数组,因此较简单
Series数组.sort_values(ascending=True)
根据 Series 数组内容进行排序
ascending=False 降序排序
ascending=True 升序排序,默认
注:只返回新数组,不改变原数组Series数组.sort_index()
根据索引进行排序
注:只返回新数组,不改变原数组
直接进行运算:
访问要进行运算的值 运算式
可以直接进行运算
运算方法 | 含义 |
---|---|
DataFrame/Series数组.add(other) | 加运算:DataFrame/Series数组元素 + other |
DataFrame/Series数组.sub(other) | 减运算:DataFrame/Series数组元素 - other |
DataFrame/Series数组.mul(other) | 乘运算:DataFrame/Series数组元素 * other |
DataFrame/Series数组.div(other) | 除运算:DataFrame/Series数组元素 / other |
DataFrame/Series数组.mod(other) | 除(取整)运算:DataFrame/Series数组元素 % other |
DataFrame/Series数组.pow(other) | 幂运算:DataFrame/Series数组元素 ** other |
数组与数组/自身之间运算(形状相同时):
直接访问元素的逻辑表达式 ⇨ 返回值:布尔数组
布尔逻辑表达式 ⇨ 返回值:布尔数组
进行基本的逻辑运算,该表达式记为“布尔数组”(重要)
逻辑运算符 | 含义 |
---|---|
> | 大于 |
< | 小于 |
!= | 不等于 |
| | 或 |
& | 与 |
DataFrame/Series数组[布尔数组]
布尔索引,索引布尔数组中为 True 的元素,并返回这些元素所在行索引
DataFrame/Series数组[布尔数组] = 值
将布尔数组中为 True 的行索引进行统一赋值
例:
DataFrame/Series数组[布尔数组]:
DataFrame/Series数组[布尔数组] = 值:
逻辑运算函数:
当列索引是以字母为开头时,列索引就是该 DataFrame/Series数组 的属性
当索引以字母为开头时,才可以使用下面这个方法:
DataFrame/Series数组.query(“列索引属性的逻辑表达式”)
根据逻辑运算符访问符合逻辑表达式的行
可以代替 DataFrame/Series数组[布尔数组] 的作用
DataFrame/Series数组[列索引].isin(values)
检验 DataFrame/Series数组[列索引] 列中对应的值是否为 values,当 DataFrame/Series数组[列索引] 中某个位置的 这个值等于values 或 这个值在values中 时,则该值所在行对应位置为 True,否则对应位置为 False
DataFrame/Series数组[列索引] 为索引出的某列的值
values 可以是一个值,也可以是一个数组
例:检验 “2021-01-02” 列是否有 2 或 3
再把这些符合的行索引出来:
DataFrame/Series数组.describe()
能够直接得出很多统计结果:count、mean、std、min、max…
统计运算方法:
统计运算方法 | 含义 |
---|---|
DataFrame/Series数组.sum([axis=0]) | (默认按列)统计总和 |
DataFrame/Series数组.mean([axis=0]) | (默认按列)统计平均值 |
DataFrame/Series数组.median([axis=0]) | (默认按列)统计中值 |
DataFrame/Series数组.max([axis=0]) | (默认按列)查找最大值 |
DataFrame/Series数组.min([axis=0]) | (默认按列)查找最小值 |
DataFrame/Series数组.mode([axis=0]) | (默认按列)统计众数 |
DataFrame/Series数组.abs([axis=0]) | 显示所有值的绝对值 |
DataFrame/Series数组.std([axis=0]) | (默认按列)统计标准差 |
DataFrame/Series数组.var([axis=0]) | (默认按列)统计方差 |
DataFrame/Series数组.idxmax([axis=0]) | (默认按列)找出最大值所在位置 |
DataFrame/Series数组.idxmin([axis=0]) | (默认按列)找出最小值所在位置 |
累计统计方法 | 含义 |
---|---|
DataFrame/Series数组cumsum() | 前1/2/3/…/n个数逐个累加求和 |
DataFrame/Series数组cummax() | 前1/2/3/…/n个数的最大值 |
DataFrame/Series数组cumin() | 前1/2/3/…/n个数的最小值 |
DataFrame/Series数组cumprod() | 前1/2/3/…/n个数逐个累计求积 |
DataFrame/Series数组.apply(func[, axis=0])
让 DataFrame/Series数组 (默认按列)执行自定义的运算
func 自定义的运算
axis=0 默认按列统计
DataFrame/Series数组.plot(x=?, y=?, kind=?)
绘制简单图
x=? 图表的x轴,用列索引指定,如:x="name"
y=? 图表的y轴,用列索引指定,如:y="score"
kind=? 图表的类型,如:kind=“scatter” 就是散点图
kind参数 | 含义 |
---|---|
line | 折线图 |
hist | 直方图 |
scatter | 散点图 |
bar | 柱状图 |
Format Type | Data Description | Reader | Writer |
---|---|---|---|
text | CSV | read_csv | to_csv |
text | JSON | read_json | to_json |
text | HTML | read_html | to_html |
text | Local clipboard | read_cliipboard | to_cliipboard |
binary | MS Excel | read_excel | to_excel |
binary | HDF5 Format | read_hdf | to_hdf |
binary | Feather Formal | read_feather | to_feather |
binary | Parquet Formal | read_parquet | to_parquet |
binary | Msgpack | read_msgpack | to_msgpack |
binary | Stata | read_stata | to_stata |
binary | SAS | read_sas | |
binary | Python Pickle Fomat | read_pickle | to_pickle |
SQL | SQL | read_sql | to_sql |
SQL | Google Big Query | read_gbq | to_gbq |
下面介绍三种最常用的文件类型的读取与存储
读取:
pd.read_csv(filepath_or_buffer, usecols=[ ], names=[ ])
读取 csv 文件
filepath_or_buffer 文件路径,带扩展名
usecols=[ ] 指定读取的列索引,列表形式
names=[ ] 当指定的 CSV 文件没有索引字段时,读取 CSV 文件时会默认把第一行数据作为列索引,这非常不好,这个时候需要自己添加字段,列表形式
例:打开当前目录下 stock_day 下的 stock_day.csv 文件,并获取 high、low、open 和 close 列
import pandas as pd
pd.read_csv("./stock_day/stock_day.csv", usecols=["high", "low", "open", "close"])
写入:
DataFrame/Series数组.to_csv(…)
把 DataFrame/Series数组 内容读取到 csv 文件中,带扩展名
path_or_buf 文件路径,文件不存在时则创建新文件
columns=[ ] 指定写入的列索引,列表形式
mode= “w”:覆盖,“a”:追加
index=True 是否写入行索引,默认为 True
header=True 是否写入列索引,默认为 True
例:把 前10行 的 open、close 列数据写入文件
import pandas as pd
data[:10].to_csv("test.csv", columns=["open", "close"])
hdf5 是存储三维数据的文件,这里的键则是指定了不同的二维表
读取:
pd.read_hdf(…)
读取 hdf5 文件
filepath_or_buffer 文件路径,带扩展名
key 读取的键
mode 打开文件的模式
写入:
DataFrame/Series数组.to_hdf(…)
写入 hdf5 文件
filepath_or_buffer 文件路径,带扩展名
key 指定键——指定要读取这张二维表时的键
mode= “w”:覆盖,“a”:追加,默认为追加,即追加一个新的键的二维表
扩展:
优先选择使用 HDF5 文件存储
pd.read_json(…)
读取 json 文件
filepath_or_buffer 文件路径,带扩展名
orient=“records” 读取文件后的展示方式,一般为 “records”(默认)
lines=False是否按行读取 json 对象,默认不是按行读取,一般选择 lines=True 按行读取
写入:
DataFrame/Series数组.to_json(…)
读取 json 文件
filepath_or_buffer 文件路径,带扩展名
orient= 读取文件后的展示方式,一般选择 orient=“records” 即可
lines=False是否按行写入 json 对象,默认不是按行写入,一般选择 lines=True 按行写入