- Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
- Pandas 名字衍生自术语 “panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。
- Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
- Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
访问作者github: https://github.com/NefelibataBIGR/Machine_Learning_Notes ,获取笔记代码
一、简介
- panel + data + analysis(panel data 面板数据)
- 数据处理工具
- Why pandas?
- 便捷的数据处理能力
- 读取文件方便
- 封装了Matplotlib、Numpy的画图和计算
二、核心数据结构
具体介绍代码见Python>pandas文件中的==data_structure.ipynb==文件
- ==dataframe==
- series
理解:DataFrame是Series的容器
1、DataFrame
(1)基本
- 结构:类似二维数组,有行、列索引
- 属性:shape、index、columns、values、T(转置)
- 方法:head()、tail()
(2)索引的设置
- 修改行列索引值(只能整体修改)
- 重设索引
- 设置新索引
(3)MultiIndex
- MultiIndex是设置了多索引之后的DataFrame,可以存储三维数据
- MultiIndex的属性有names、levels
2、Series
带索引的一维数组
属性:index、values
方法:创建Series、head()、tail()
三、基本数据操作
具体代码见Python>pandas文件中的==basic_data_operations.ipynb==文件
1、索引操作
- 直接索引(必须先列后行)
- 按名字索引(loc,先行后列)
- 按数字索引(iloc,先行后列)
- 组合索引(loc、iloc,数字和名字混用)
- isin():判断某一行是否存在某个值
2、赋值操作
- 整列修改
- 索引到某个值后修改
3、排序操作
- 对内容排序(.sort_values(by=’ ‘, ascending=True/False))
- 对索引排序(.sort_index())
对于Series来说只有一维,不用考虑按照哪个字段排序
4、运算操作
主要是DataFrame
算术运算(add())
逻辑运算
- 逻辑运算符(<、>、|、&)
- 逻辑运算函数(**query(查找的字符串)**、isin())
统计运算
- 统计指标:count、min、max、mean、median、var、std
- describe():直接得出统计指标
- 效果:
- 效果:
- 返回索引:idxmin()、idxmax()
- 累计统计函数:cumsum()、cummax()、cummin()、cumprod()
- 配合画图函数plot():默认为折线图
- cumsum()画图效果:(记得先对时间排序再累加)
- cumsum()画图效果:(记得先对时间排序再累加)
自定义运算(apply(func, axis= ))
- func:自定义函数
- axis:默认为按列运算axis=0
5、画图操作
- (Series).plot():默认折线图(见上面运算操作中的统计运算)
- (DataFrame).plot():参数x、y、kind(图的类型)
API:
散点图效果:(kind=’scatter’)
四、文件读取与存储
具体代码见Python>pandas文件中的==file_reading.ipynb==文件
- numpy缺点:读不了字符串
- 大部分数据文件pandas都可以读取
pandas可读取和储存的文件↑
1、csv文件
读取:
- pd.read_csv(路径)
- 参数(可省略):
- usecols:只读取这些列
- names:命名列索引
- 参数(可省略):
存储:
- (DataFrame).to_csv(路径)
- 参数(可省略):
- columns:只保存指定的列,用列表选取
- mode:读写方式,默认”w“重写,“a“追加
- index:默认为True(保留行索引),False不保留
- header:默认为True(保留列索引),False不保留
- 参数(可省略):
2、hdf5文件
- 二进制文件,不能直接预览
- 具有许多优点
- 一个键对应一个DataFrame,可以理解成存储三维数据
读取:
- pd.read_hdf(路径 , key= ):多个键时必须指定key=
- 参数(可省略):
- mode:打开文件的模式
- 参数(可省略):
存储:
- (DataFrame).to_hdf(路径 , key= ):存储时key必须有
3、json文件
- 前后端交互经常用到
读取
- pd.read_json(路径 , lines= )
- 参数:
- orient:读取的json文件以什么形式展示,一般用”records”
- lines:是否按行读取,填bool值,默认为False,一般需要指定为True
- 参数:
存储
- (DataFrame).to_json(路径 , key= )
- 参数:
- orient:读取的json文件以什么形式展示,一般用”records”
- lines:是否按行读取,填bool值,默认为False,一般需要指定为True
- 参数:
五、高级处理
具体代码见Python>pandas文件中的==advanced_processing.ipynb==文件
- 缺失值处理
- 数据离散化
- 合并
- 交叉表与透视表
- 分组与聚合
1、缺失值处理
(1)How?
- 思路:
- 删除含有缺失值的样本
- 替换/插补,一般用平均值 / 众数值替换
(2)处理NaN
- 判断是否存在NaN(结合np.any/np.all判断,或者直接加any()/all())
- pd.isnull(DataFrame):缺失值的地方返回True
- pd.notnull(DataFrame):不是缺失值的地方返回True
- 删除含有缺失值的样本
- df.dropna(inplace= ):默认按行删除,默认inplace=False不修改原数据,生成新对象
或:
- df.dropna(inplace= ):默认按行删除,默认inplace=False不修改原数据,生成新对象
- 替换/插补
- 平均值插补:df.loc[:, ‘xxx’] = df[‘xxx’].fillna(df[‘xxx’].mean())
- 众数值插补:
- counts = x_pred[feat].value_counts()
- x_pred.loc[:, feat] = x_pred[feat].fillna(counts.idxmax())
(3)处理非NaN的缺失值
- 替换:符号 -> np.nan
- df.replace(to_replace=需要替换的东西 , value=np.nan)
- 处理NaN
2、数据离散化
用数据表示特征(取代字符串),便于后续运算
将连续数据分成多个离散区间,用不同的值代表落在区间
one-hot编码(独热编码/哑变量)数据离散化为了简化数据结构,让数据之间关系平等
案例:股票的涨跌幅离散化,见文件
如何实现数据离散化?
- 分组
- 自动分组:sr = pd.qcut(data , 组数)
- 自动分成等间距的组
- 自定义分组:sr = pd.cut(data , bins=[区间] )
- 区间列表内只用传各个区间边界值,如:bins = [150, 165, 180, 195] 分成三个区间
- 自动分组:sr = pd.qcut(data , 组数)
- 转换成独热编码(one-hot编码/哑变量)
- pd.get_dummies(sr , prefix= 前缀 , dtype=int)
3、合并
(1)按方向合并
- pd.concat([data1 , data2] , axis= ):默认axis=0竖直拼接
(2)按索引合并
- pd.merge(左表 , 右表 , how=”连接方式” , on=[索引]):默认how=”inner”内连接
连接方式,与SQL类似,碰到不共有的键补NaN
4、交叉表与透视表
- 探索两个变量直接的关系
(1)交叉表
- 寻找两数据列之间的关系
- pd.crosstab(数据列1 , 数据列2):得到的是频数分布(先行索引,后列索引)
pandas日期类型,如date = pd.to_datetime(stock.index),用date.year/month/week等获取日期信息
(2)透视表
- df.pivot_table([ ] , index=[ ]):直接得出频率
5、分组与聚合
什么是分组与聚合:
按类别分组,再经过统计函数聚合
一般同时使用分组与聚合DataFrame方法:
- df.groupby(by=[“分组按照的列”])[“需要聚合的列”].func( ):func( )为聚合的统计函数,分组按照的列可以不止一个,放在列表给出
- 例如:col.groupby(by=[‘color’])[‘price1’].max()
Series方法:
- df[“需要聚合的列”].groupby(by=df[“分组按照的列”]).func( )
- 例如:col[‘price1’].groupby(by=col[‘color’]).max()
星巴克零售店铺数据案例:见文件
六、综合案例:电影数据分析
具体代码见Python>pandas文件中的==comprehensive_case.ipynb==文件