文章目录
Pandas介绍
Pandas是专门用于数据挖掘的开源Python库。以Numpy为基础,具有良好的计算性能;基于Matplotlib,能够简便地绘图;还有自带独特的数据结构
Pandas优势:
- 增强图表的可读性
- 便捷的数据处理能力
- 读取文件方便
- 封装了Matplotlib和Numpy的绘图和计算
Pandas数据结构
Pandas的数据结构主要有三种:
- Series:一维数据结构
- Dataframe:二维表格型数据结构
- MultiIndex(老版本叫Pannel):三维数据结构
Series
Series是一个类似与一维数组的数据结构,它能保存任意类型的数据,如整数浮点数字符串等,主要由一组数据和与之相关的索引两部分构成
-
Series的创建
import pandas as pd pd.Series(data=None, index=None, dtype=None)
参数:
- data:传入的数据,可以是ndarray、list等
- index:索引,必须唯一且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0~n的整数索引
- dtype:数据的类型
通过已有数据创建:
# 指定内容,默认索引 pd.Series(np.arrange(10)) # 指定索引 pd.Series([1,2,3,4,5], index=[0,1,2,3,4])
通过字典数据创建:
count = pd.Series({'red':100, 'blue':200, 'green':500, 'yellow':1000})
-
Series的属性:
为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性index和values-
index
# 获取全部索引 count.index
-
values
# 获取全部数据 count.values
-
DataFrame
-
DataFrame的创建
# 导入pandas import pandas as pd pd.DataFrame(data=None, index=None, columns=None)
参数:
- index:行标签,如果没有传入则默认0~n
- columns:列标签,默认0~n
创建实例:
# 创建两行三列0-1之间的随机数表 pd.DataFrame(np.random.randn(2,3)) # 创建学生成绩表 score = np.random.randint(40, 100, (10, 5)) # 成绩 subjects = ["英语", "数学", "专业课", "政治"] # 科目 stu = [str(i + 1) + '号考生' for i in range(10)] # 学生 data = pd.DataFrame(score, columns=subjects, index=stu)
-
DataFrame的属性
-
Shape
# 获取DataFrame的形状 data.shape
-
index
# 获取行索引列表 data.index
-
columns
# 获取列索引列表 data.columns
-
values
# 直接获取其中的值 data.values
-
T
# 返回转置的表格 data.T
-
head(n)
# 返回前5行数据 data.head(5)
-
tail(n)
# 返回后5行数据 data.tail(5)
-
-
DataFrame索引设置
注意:修改行列索引值的时候必须整体全部修改,不能只改单个-
直接修改行列索引值
stu = ["学生" + str(i) for i in range(10)] data.index = stu
-
- 重置索引
```python
data.reset_index(drop=False) # drop表示是否删除原来索引,True删False不删
-
以某列为索引
df = pd.DataFrame({'month':[1,4,7,10],'year':[2012,2014,2016,2018], 'sale':[31,40,55,84]}) df.set_index('month') # 以month为索引 df.set_index(['month', 'year']) # 设置多个索引,以年和月份,变成了MultiIndex的DataFrame
MultiIndex
MultiIndex是一个三维的数据结构:多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引
-
MultiIndex的特性
# 接上个代码块,df为设置了多个索引的DataFrame df.index # 查看索引结果
index属性
-
names:levels的名称
df.index.names
-
levels:每个level的元组值
df.index.levels
-
-
MultiIndex的创建
arrays = [[1,1,2,2], ['red','blue','red','blue']] pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
基本数据操作
索引操作
Numpy中可以使用索引选取序列和切片选择,Pandas也支持类似的操作,也可以直接使用列名称和行名称,甚至组合使用
-
直接使用行列索引(先列后行)
例:获取‘2018-02-27’这天的‘close’的结果# 直接使用行列索引名字的方式(切记是先列后行) data['close']['2018-02-27'] # 不支持的操作: data['2018-02-27']['close'] # 报错,pandas索引先列后行 data[:1, :2] # 报错,pandas不支持直接切片
-
结合loc或iloc使用索引
例:获取从‘2018-02-27’到‘2018-02-22’,‘open’的结果# 使用loc:只能指定行列索引的名字 # 注意loc使用的是先行后列的索引 data.loc['2018-02-27':'2018-02-22', 'open'] # 使用iloc: 可以通过索引的下标去获取 # 获取前3天的数据,前5列的结果 data.iloc[:3, :5] # 同样是先行后列
-
使用ix组合索引(不推荐)
例:获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这四个指标的结果# 使用ix进行小标和名称组合的索引 data.ix[0:4, ['open', 'close', 'high', 'low']] # 推荐使用loc或iloc写法 data.loc[data.index[0:4], ['open', 'close', 'high', 'low']] data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
赋值操作
例:对DataFrame当中的close列重新赋值为1
# 直接修改原来的值
data['close'] = 1
# 或者通过.的方式赋值
data.close = 1
排序操作
排序有两种方式,一种对于索引进行排序,一种对于内容进行排序
-
DataFrame排序
-
使用df.sort_values(by=, ascending=)通过单个键或多个键对按大小对内容排序
-
参数:
- by: 指定排序参考的键
- ascending: False为降序,True为升序,默认升序
-
实例:
# 单个键 data.sort_values(by="open", ascending=True) # 多个键 data.sort_values(by=['open', 'high'])
-
-
使用df.sort_index给索引进行排序
# 对索引进行排序 data.sort_index()
-
-
Series排序
-
使用Series.sort_values(ascending=True)进行排序
# Series排序时,只有一列,不需要参数 data['date'].sort_values(ascending=True)
-
使用Series.sort_index()进行排序
# 与DataFrame一致 data['date'].sort_index()
-
Dataframe运算
算术运算
df['column'].add(Number)
为某列所有数加上一个数df['column'].sub(Number)
为某列所有数减去一个数
逻辑运算
-
逻辑运算符号:
& 逻辑与 | 逻辑或 ~ 逻辑非
> 大于 >= 大于等于 < 小于 <= 小于等于
-
逻辑运算函数:
-
query(expression string)
# 用于查询某些内容 data.query("number > 5 & number < 10")
-
isin(values)
# 可以指定值进行判断,用于进行元素的筛选 data[data["column"].isin([12.5, 40.5])] # 筛选值在 12.5 - 40.5 这个区间内的数据
-
统计运算
-
describe函数:用于数据综合分析,能够直接得出很多统计结果,如count、mean、std、min、max等
data["column"].describe() # 直接输出统计结果
-
统计函数:
函数 介绍 sum([axis=0]) 累加求和函数 mean([axis=0]) 求均值函数 median([axis=0]) 求中位数函数 min([axis=0]) 求最小值函数 max([axis=0]) 求最大值函数 mode([axis=0]) 求众数函数 abs([axis=0]) 求绝对值函数 prod([axis=0]) 累乘求积函数 std([axis=0]) 求标准差函数 var([axis=0]) 求方差函数 idxmax([axis=0]) 返回最大值的索引值 idxmin([axis=0]) 返回最小值的索引值 **注意:**使用统计函数时需要明确指定axis,也就是轴。当axis=0(默认)时按列统计,axis=1时按行统计
-
累计统计函数:
函数 介绍 cumsum 计算前n个项之和 cummax 计算前n个项的最大值 cummin 计算前n个项的最小值 cumprod 计算前n个项的积
自定义运算
当Pandas和Numpy内置的函数无法满足业务需求时,需要自定义函数来执行这些特殊的业务逻辑(如某两个列相乘后和第三个列相加……)
# API
df[[column1, column2, ……]].apply(func, axis=0) # 注意:func可传函数名或lambda表达式
# 实例:定义一个某列的最大值减去该列的最小值的函数
data[["col1", "col2"]].apply(lambda x: x.max() - x.min(), axis=0)
Pandas绘图
Pandas.DataFrame.plot
写法:DataFrame.plot(kind='str')
参数:kind='str'
, 表示绘图的种类,取值包括:
- ‘line’:折线图(默认)
- ‘bar’:柱状图
- ‘barh’:水平柱状图
- ‘hist’:频率分布直方图
- ‘pie’:饼图
- ‘scatter’:散点图
Pandas.Series.plot
写法:Series.plot(kind='str')
参数:kind='str'
取值包括:
- ‘line’:折线图(默认)
- ‘bar’:柱状图
- ‘barh’:水平柱状图
- ‘hist’:频率分布直方图
- ‘pie’:饼图
- ‘scatter’:散点图
**注意:**plot函数绘制完图后,需要使用plt.show()才能让图像显示出来,并且需要提前引入matplotlib.pyplot
文件读取与存储
Pandas支持复杂的IO操作,提供的API支持众多文件格式:
编码类型 | 数据描述 | 读取API | 写入API |
---|---|---|---|
文本 | csv | read_csv | to_csv |
文本 | json | read_json | to_json |
文本 | html | read_html | to_html |
文本 | local clipboard | read_clipboard | to_clipboard |
二进制 | excel | read_excel | to_excel |
二进制 | hdf | read_hdf | to_hdf |
二进制 | fether | read_fether | to_fether |
二进制 | parquet | read_parquet | to_parquet |
二进制 | msgpack | read_msgpack | to_msgpack |
二进制 | stata | read_stata | to_stata |
二进制 | sas | read_sas | |
二进制 | python pickle | read_pickle | to_pickle |
SQL | sql | read_sql | to_sql |
SQL | google big query | read_gbq | to_gbq |
下面介绍几种常用的读写API
读写CSV格式文件
# 读取操作
# 指定文件目录和分隔符以及要读取的列,后面两个参数可省略
pandas.read_csv('file_path', sep=',', usecols=['col1', 'col2'])
# 写入操作
# 指定文件目录、分隔符、要写入的列、是否写入列的索引值、是否写入行的索引值、重写'w'或追加'a',以及编码格式,只有文件目录参数不可省略
DataFrame.to_csv('file_path', sep',', columns=None, header=True, index=True, mode='w', encoding=None)
读写JSON格式文件
# 读取操作
pandas.read_json('file_path', orient='', typ='', lines=False)
- orient取值:
- ‘split’:将索引整合到索引,列名整合到列名,数据整合到数据,三部分分开
- ‘records’:以
columns: values
形式输出 - ‘index’:以
index: {columns: values}
形式输出 - ‘columns’:以
columns: {index: values}
形式输出 - ‘values’:直接输出数据,没有行索引和列索引
- typ取值:
- 默认’frame’,指定转换成的对象类型是Series还是DataFrame
- lines取值:
- 默认False,逐行读取json对象
# 写入操作
pandas.to_json('file_path', orient='', lines=False) # 参数取值同上
高级处理
缺失值处理
- 使用isnull()、notnull()函数判断是否有缺失数据NaN
- 使用fillna()函数实现缺失值的填充
- 使用dropna()函数实现对缺失数据的删除
- 使用replace()函数实现数据的替换
数据离散化
数据离散化就是将大量的数据按照某些等长区间进行划分,然后统计这些数据落在区间内的个数。
-
API:
# 自行分组(自动分成差不多数量的类别) qcut = pd.qcut(df['col1'], 10) # 参数: 哪些数据,分几组 # 计算分到每个组数据的个数 qcut.value_counts() # 自定义区间分组 bins = [1,3,5,7,9,11,13,17,19] qcut = pd.qcut(df['col1'], bins) # 将自定义的区间传入 qcut.value_counts()
-
one-hot编码:
# pd.get_dummies(data, prefix=None) # prefix是分组名字 dummies = pd.get_dummies(df['col2'], prefix="Top")
合并
如果你的数据由多张表组成,那么有时候需要将不同的内容合并到一起进行分析
-
API:
# pd.concat() 实现数据合并 pd.concat([data1, data2], axis=1) # 按行或列进行合并,列0行1 # pd.merge() 实现数据合并 pd.merge(data1, data2, how='inner', on=None) # 类似数据表的连接,left join, right join, innner join, outer join,how指定连接方式(默认内连接),on指定共同的键
交叉表与透视表
-
交叉表:用于计算一列数据对于另一列数据的分组个数统计(用于统计分组频率的特殊透视表)
-
API:
pd.crosstab(df['col1'], df['col2']) # 传入相同表的两个不同列,结果是数值
-
-
透视表:将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
-
API:
# data.pivot_table() DataFrame.pivot_table(['需要统计的列'], index='统计所依照的索引') # 结果是百分比
-
分组与聚合
分组是为了更好的聚合运算
-
API:
DataFrame.groupby(key, as_index=False)