pandas 统计描述
一个强大的分析结构化数据额的工具集
基础是Numpy,提供了高性能矩阵的运算
应用数据挖掘,数据分析
如,学生成绩分析,股票数据分析等
提供数据清洗功能
Series
类似一维数组的对象
通过list构建Series
import pandas as pd
ser_obj = pd.Series(range(10))
有数据和索引组成
索引在在左,数据在右
索引是自动创建的
获取数据和索引
ser_obj.index,ser_obj.values
预览数据
ser_obj.head(n)
通过索引获取数据
ser_obj[idx]
索引与数据的对应关系仍保持在数组运算的结果中
通过dict构建Series
那么属性
ser_obj.name,ser_obj.index.name
DataFrame
类似多维数组/表格孙书记(如Excel,R中的data.frame)
每列数据可以是不同的lei8x,what about ndarray?
索引包括列索引和行索引
通过ndarray构建DataFrame
通过dict构建DataFrame
通过列索引获取数据(Series类型)
df_obj[col_idx]
或
df_obj.col_idx
增加列数据,类似dict添加key-value
df_obj[new_col_idx] = data
删除列
del df_obj[col_idx]
...
d = pd.DataFrame([[52,6,95],[44,8,61],[1,23,3]],columns = ['a','b','c']) d.head()# 头部书籍,默认前五行,d.head(行数) d.tail() # 尾部数据,默认是后五行,d.tail(行数)
索引对象lndex
Series和 DataFrame 中的索引都是lndex对象
不可变(immutable)
保证了数据的安全
常见的lndex种类
lndex
ln64lndex
Multilndex,'层级'索引
Datetimelndex,时间戳类型
索引操作
Series索引
行索引,ser_obj['label'],ser_obj[pos]
切片索引,ser_obj[2:4],ser_obj['label1':'label3']
注意,按索引名切片操作时,时包含终止索引的
不连续索引,ser_obj[['label1','label2','label3']] ser_obj[[pos1,pos2,pos3]]
布尔索引
DataFrame索引
列索引
df_obj['label']
不连续索引
df_obj[['label1','label2']]
索引操作总结
Pandas 的索引可归纳为3种
.loc 标签索引
.iloc 位置索引
.ix 标签与位置混合索引
先按标签索引尝试操作,然后在按位置索引尝试操作
注意
DataFrame 索引时可将其看作 ndarray 操作
标签的切片索引时包含末尾位置的
函数应用
可直接使用NumPy的 ufunc 函数,如 abs 等
通过apply将函数应用到行或列上
注意指定周的方向,默认axis=0
通过 applymap 将函数应用到每个数据上
排序
sort_index,索引排序
对 DataFrame操作时注意轴方向
按值排序
sort_values(by='label')
处理缺失数据
判断是否存在缺失值
ser_obj.jsnull(),df_obj.isnull()
dropna
丢弃缺失数据
fillna
填充缺失数据
常用的统计计算
sum,mean,max,min...
axis=0 按列统计, axis=1 按行统计
skipna 排除缺失值,默认为 True
idmax,idmin,cumsum
统计描述
describe 产生多个统计数据
----------------------------------------------------------------------------
数据的分组与聚合
层级索引
Multilndex 对象
选取子集
外层选取 ser_obj['outer_label']
内层选取 ser_obj[:,'inner_label']
常用于分组操作,透视表的生成等
交换分层顺序
swaplevel()
排序分层
sortlevel()
分组
对数据集进行分组,然后对每组进行统计分析
SQL能够对数据进行过滤,分组聚合
pandas能利用groupby进行更加复杂的分组运算
分组运算过程
split -> apply -> combine
拆分: 分组的根据
应用:每个分组运行的计算规则
合并:把每个分组的计算结果合并起来
GroupBy 对象: DataFrameGroupBy,SeriesGroupBy
GroupBy对象没有进行实际运算,只是包含分组的中间数据
对 GroupBy 对象进行分组运算/多重分组运算,如mean()
非数值数据不进行分组运算
size() 返回每个分组的元素个数
按列名分组
obj.groupby('label')
按列名多层分组
obj.groupby(['label1','label2'])# -> 多层 dataframe
按自定义的key分组
obj.groupby(self_def_key)
自定义的key可为列表或多层列表
unstack 可以将多层索引的结果转换成单层的 dataframe
GroupBy 对象支持迭代操作
每次迭代返回一个元组( group_name,group_data )
可用于分组数据的具体运算
GroupBy 对象可以转成列表或字典
Pandas 也支持按列分组
其他分组方法:
通过字典分组
通过函数分组,函数传入的参数为行索引或列索引
通过索引级别分组
聚合
数组产生标量的过程,如mean(),count() 等
常用于对分组后的数据进行计算
内置的聚合函数
sum(),mean(),max()0,min(),count(),size(),describe()
可自定义函数,传入agg方法中
grouped.agg(func)
func的参数为 groupby 索引对应的记录
分组运算
原因
聚合运算改变了原始数据的shape
如何保持原始数据的shape
使用merge的外链接,比较复杂
transform
transform 的计算结果和原始数据的shape保持一致
如: grouped.transform(np.mean)
也可传入自定义函数
------------------------------------------------------------------
数据清洗,合并,转化和重构
数据清洗时数据分析关键的一步,,直接影响之后的处理工作
数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘?
是一个迭代的过程,实际项目中可能需要不止一次的执行这些清洗操作
处理缺失数据
pd.fillna(),pd.dropna()
pd.merge
根据单个或多个键将不同 DataFrame 的行连接起来
累比数据库的连接操作
默认将重叠的列名作为 外键 进行连接
on 显示指定 外键
left_on 左侧数据的 外键
right_on 右侧数据的 外键
默认是‘内连接’(inner),既结果中的键是交集
how 指定连接方式
‘外连接’(outer),结果中的键是并集
‘左连接’(left)
‘右连接’(right)
处理重复列名
suffixes, 默认为 _x,_y
按索引连接
left_index = True 或 right_index = True
pd.concat
沿轴方向将多个对象合并到一起
NumPy 的 concat
np.concatenate
pd.concat
注意指定轴方向,默认axis = 0
join 指定合并方式,默认 outer
Series 合并是查看行索引
DataFrame 合并是同时查看行索引和列索引
重构
stack
将列索引旋转为行索引,完成层级索引
DataFrame -> Series
默认操作内层索引,既 leve = -1
处理重复数据
duplicated()返回布尔型 Series 表示每行是否为重复行
drop_duplicates() 过滤重复行
默认判断全部列
可指定按某些列判断
map
Series 根据 map 传入的函数对每行或每列进行转换
数据替换
replace
-----------------------------------------------------------------------------
聚类模型: K-Means
聚类 属于无监督学习
无类别标记
算法接收参数K:然后将样本点划分为K个聚类,同一聚类中的样本相似度较高,不同聚类中的样本相似度较小
算法思想:一空间中K个样本点为中心进行聚类,对最靠近它们的样本点归类。通过迭代的方法,逐步更新各聚类中心,直至达到最好的聚类效果
算法描述:
1.选择K个聚类的初始中心
2.在第N次迭代中,对任意一个样本点,求其到K个聚类中心的距离,将该样本点归类奥距离最小的中心所在的聚类
3.利用均值等方法更新各类的中心值
4.对所有的K个聚类中心,如果利用2,3步的迭代更新后,达到稳定,则迭代结束
优点
速度快,简单
缺点
最终结果和初始点的选择相关,容易陷入局部最优,需要给定K值