Pandas基础笔记
参考图书《利用python进行数据分析》
参考 Python中文文档
参考 英文文档
前言
- Pandas是基础的Python数据分析中,最重要的包
数据结构
Series
- 类似一维数组+index索引
- 创建
- Series()
- 传入一个序列化的对象,序列化索引
- 也可以通过字典建立
- 属性
- .name
- .index
- .index.name
DataFrame
- 高维数组 (最常见二维数组+index+columns)
- pd.DataFrame( 等长列表、NumPy数组字典)
- .head()
- 可按照字典标记、属性标记检索为Series
- df[‘col’]
- df.col
- del df[‘col’] 直接删除指定col列
- df.values 将df的数据以ndarry形式返回 在机器学习中常用
索引对象
- 特征
- 不可修改
- 可以重复
- 可以重构
- 索引的方法属性
- x.append(index) 追加索引
- x.defference(y) 两索引差集
- x.intersection(y) 两索引交集
- x.union(y) 两索引并集 需要非重复索引
- x.isin(y) 索引x中的各个元素 在y索引中的成员资格组成的 array
- x.delete(loc) 索引x 删除指定位置行 返回一个新索引
- x.drop(索引) 索引x 删除指定索引 返回一个新索引
- x.insert(loc, item)
- is_monotonic 递增检查 属性
- is_unique 唯一性检查 属性
Pandas基本功能
索引功能
- 重建索引
- df.reindex()
- method ffill, bfill 向前向后填充
- fill_value 缺失值填充
- limit tolerance 填充限制
- level 索引等级
- copy 默认进行复制
- .set_index(key) 把某一列设置为索引
- .reset_index() 重置为整数索引
- df.reindex()
- 索引重命名
- index=
- .columns=
- .rename(index={}, columns={})
- index.maps(func)
- columns.maps(func) 修改某列名称 相当于更改表头
- 索引选取
- 直接索引
- df[val]
- df.loc[val]
- df.loc[:,val]
- df.loc[val,:]
- df.at[val1, val2]
- 整数索引
- df.iloc[where]
- df.iloc[where1, where2]
- df.iat[i, j]
- get_value
- set_value
- 直接索引
算术和数据对齐
- 不同索引对象之间的算术方法会自动对齐 ,就是相同索引进行计算
- fill_value() 空值填充
函数应用和映射
- NumPy的通用元素级别函数
- apply(func(Series)) Series级别的函数
- 返回标量
- 返回一个Series
- applymap(func)
- 元素级别的Python函数
- 例如
df.applymap(lambda x:'%.2f'%x)浮点数格式化字符串
排序和排名
- 排序
- sorted_index 按照索引排序
- sorted_values
- by= 按照哪一\多列排序
- ascending=False 降序
- 排名
- rank()
- axis=
- method
- average
- min
- max
- first
- dense 组件排名增加1的min方法
- rank()
描述性统计
- 各项指标信息
- describe()
- 约简型统计
- sum min max mean
- quantile 分位数
- var 方差
- mad 平均绝对偏差
- std 标准差
- diff (时间序列的算术差值)
- pct_change 计算百分比
- 累计型
- cumsum 累计和
- cumprod 累计积
- cummin, cummax 累计值的最小最大值
- 间接统计
- idxmax 最大值索引
- idxmin
- 相关性、协方差
- df.corr()
- df.cov()
- df1.corrwith(Series/df2) 计算和某一个Series,df中对应col的相关性
计数与成员资格
- unique()
- value_counts()
- isin() 成员资格的布尔数组
- pd.match(s1, s2)
- 计算Series1,中的各个元素在Series中的整数索引
- 找不到对应位置返回 -1
- 找到 则返回整数索引值
数据加载
读取文本格式
read_csv()
- header 表头 即columns
- sep 分割符
- encoding
- parse_dates
- True 解析时间格式,在所有列执行
- [‘date’] 将date列作为时间列进行解析
某些含有汉字名称的csv文件解决方案
f=open(file_path),df = pd.read_csv(f)
也可以尝试不同的读取engine,或者使用charset检查文件的编码格式,按照指定编码读取解析
- read_json()
- read_excel()
- json格式的序列化反序列化
- json.loads() 把json字符串转化为python对象
- json.dumps() 把python对象转化为json格式字符串,传输需要
- 网络数据解析
- read_html() 读取html文件中的所有表格数据
- 更常见的其他解析方式如xpath beautifulsoup解析完后再处理
数据清洗准备
缺失数据处理
- 丢弃缺失值 dropna()
- subset=[] 检测哪几列
- how
- any
- all
- threah=m 空值数量容忍 这一行有>=m个空值时才删除
- 补全缺失值
- df.fillna()
- {} 按照字典填充
- 数值例如0 空值填充为0
- method
- ffill 向前填充
- bfill 向后填充
- limit 最大填充范围
- inplace
- True 不生成副本 直接修改原数组
- df1.combine_first(df2)
- 如果df1中的数据为空,则用df2进行填充
- df.interpolate()
- method
- liner 线性插值
- ploynominal 多项式插值等等
- method
- df.fillna()
数据转换
- 移除重复数据
- drop_duplicated()
- subset=[] 传入列表 对指定列进行查重删除
- keep 保留
- last
- first
- false
- drop_duplicated()
- 替换数据
- Series.repalce()
- (a,b) 把Series中的a,可以是列表,替换为b
- {a:b}字典替换
- Series.str.replace() 是针对字符串形式的操作,函数不同
- Series.repalce()
- 函数映射转换
- map()
- {} 字典映射
- func 函数映射
- map()
重命名轴索引
- df.index= 直接重新赋值
- df.index.map()
- df.rename
- (index=str.title, columns=str.upper) 传入函数名
- {} 字典形式的修改
离散化面元积分
- 将诸如年龄段、时间段之类的数据进行划分段
例 ages=[20,22,25,27,21,23,37,31,36],bins=[17,25,35,60] - cat=pd.cut(x=ages, bins=bins)
- x 原数组
- bin 指明划分依据
- 整数 分成数量相当的几个箱子
- 标量序列 按照给定的序列分箱
- right 默认左开右闭
- lables=[] 对箱体进行标注命名
- pd.value_counts(cat) 返回面元划分之后各组的计数
- qcut() 按照样本的分位数进行划分 而非样本个数
其他
- 随机抽样
- sample()
- n 抽取几行
- frac 抽取比例
- frac = 1 也就是随机重排
- 使用iloc整数索引、take
- sam = np.random.permutation(n)
- df.iloc[sam]
- df.take(sam)
- sample()
- 生成虚拟变量
- get_dummies(df[‘key’])
- join()
- 字符串函数
- map(正则func)
- .str.
- contains endswith startswith match replace等
数据规整
重塑
- 轴向旋转
- stack() 折叠
- unstack() 展开
- 重排
- swaplevel() 多层级级索引交换层级
- 重建索引 把某列设置为索引
- set_index()
- key= 列名或者列表(层级索引)
- append 是否追加 默认 False
- drop 删除用来索引的列 默认 True
- reset_index()
- 重建整数索引,原来的索引被分配到各个列
- set_index()
- 在指定级别的操作
- sum(level=)
- sort_index(level=)
- 透视表
- pivot_table() 建立透视表
- index 列
- columns 列
- aggfun 运算方法
- margins 是否显示汇总信息
- 实际使用中个人更习惯groupby().apply({})的方法
- pivot()
- index 行索引
- columns 列
- values 值
- melt() pivot的逆操作
- id_vars 分组指标
- value_vars 值列
- pivot_table() 建立透视表
合并数据集
- pd.merge(df1,df2) 数据逻辑上的连接
- on 连接键设置
- left_on
- right_on
- on
- how
- inner outer left right
- suffixes 指定附加到新的列名上的字符串
- sort
- False 不排序
- left_index 将左侧行索引作为连接键
- right_index 将右侧索引作为连接键
- on 连接键设置
- pd.concat([df1, df2]) 堆叠数据 相当于表格下面\右边再加上一张表
- axis=
- 0/1 在行方向、列方向进行堆叠
- axis=
可视化
- 略
- 本书介绍了 matplotlib、seaborn 的一些可视化包。起初我也用seaborn 绘图,后来改用pyecharts、plot、dash。不再使用 seaborn 也不太推荐大家使用这本数里介绍的两个包。
| 可视化包名称 | 代码量 | 交互性 | 是否支持dataFrame接口 | | —- | —- | —- | —- | | Matplotlib | 大 | 无 | 否 | | Seaborn | 小 | 无 | 是 | | pyechart | 中 | 好 | 否 | | Plotly | 小 | 好 | 是 |
其他特点
- pyechart 可以制作较为布置灵活的仪表盘,可以生成独立的配置文件记录子表的位置大小信息,同时制作地图类型的图表时,渲染快速。
- pyechart 官方中文文档
- dash时一个 plotly 和 Flask 结合的框架,
- 这是Dash官网
- 这是plotly教程,没有找到离线文档,只能在线查,国内响应比较慢。
- 这是plotly python-api
- 这是官网的一份Dash框架离线文档,优化了结构目录。
聚合与分组运算
数据分组
- grouoby
- 列名 按照某列进行分组
- {} 字典 将不同列归入同一个分组
- 函数
- len 按照字符串长度进行分组
- 自定义函数
- 匿名函数
- level= 在哪个层级进行分组
- 分组迭代
- groupby 生成含组名和数据块的二维元组序列
for name, group in df.groupby('key1'):for (k1, k2), group in df.groupby(['key1', 'key2']):
- 数据聚合
- 系统聚合函数 直接调用 .mean()
- mean sum count median 之类
- 自定义聚合函数
- agg(fun)
- 字典式多列不同聚合
- agg({“”:np.mean,””:np.sum})
- 可以使用列表 对一列同时使用不同的聚合
- as_index= Fales
- 关闭分组后的自动建立索引
- 默认 True 推荐False
- 系统聚合函数 直接调用 .mean()
- apply
- groupby最常用的拆分-应用-联合功能
- 会将待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将片段组合到一起
- 举例
- 使用各自分组的均值进行填充
- 分组随机采样
- 分组加权平均
- 分组线性回归
时间序列
时间序列的功能 我使用比较少 不熟悉
时间数据类型工具
- datetime 模块
- strptime() 解析指定格式的时间字符串 返回时间
- strftime() 返回字符串
- dateutil.parser.parse()
- 把可以分辨的时间字符串转换为时间格式
索引、选择、子集
- 假设存在dataFrame ts 以时间序列作为index
- ts[‘2010-1-5’] 传递一个可以解释的时间字符串
- ts[datetime()] 传递 datetime 对象
- ts[‘2020-6’:’2020-9’] 传递范围字符串
- dataFrame的一般索引方式
- ts.truncate(before=None, after=None, axis=None, copy=True)
- ts.loc[‘2020-5’] 表示时间的字符串即可 时间粒度可以更高
日期的范围、频率、移位
- 生成日期范围
- pd.date_range()
- start=None 开始
- end=None 截止
- periods=None 几个阶段
- freq=None 频率
- pd.date_range()
- 频率
- 频率有基础频率和倍数组成
- 时间序列的频率非常多 自然天、工作日、小时、季度等等
- 偏移
- rollback() 向后调整到指定频率的时间
- rollforard() 向前调整到制定频率的时间
- resample() 重采样
时区处理
- 时区的本地化转换
- tz.tz_localsize(‘utc’)
- tz_eastern.tz_convert(“Asia/Shanghai”)
- 时间戳
- 不同时区的时间戳记录是一样的
区间频率转化
- asfreq()
- freq,
- how=
- start
- end
重采样与频率转换
- 重采样
- 向下采样 高频居合到低频 天-月
- resample()
- freq
- closed 向下采样封闭
- right 右闭区间
- left 左闭区间
- conversition 向上采样
- strat 低频转换高频的约定 起始时间
- end 种植时间
- 向下采样
- 聚合函数应用
- OHLC重采样
- open high low close 股票指标常用
- 向上采样
- 插值函数应用
移动窗口函数
- rolling()
- window 窗口长度
- min_periods=None 最小窗口长
- center=False 默认选右边缘
- win_type=None none表示按照等权重,
- 三角权重
- on=None 列名
- axis=0 轴方向
- closed=None
- 指数加权函数
- 指定一个常数衰减因子,以便于给近期参考值更多的权重
- .ews(span=n).mean() 指用指数衰减的形式 以跨度为n 进行指数加权
- 二元移动窗格
- rolling().corr()
- 自定义函数
- rolling().apply()
