13.Python处理高级数据结构和数据分析常用扩展库:Pandas
1、Pandas介绍
Pandas是一个用于处理高级数据结构和数据分析的Python库。基于Numpy构建的一种工具,纳入了大量模块和库一些标准的数据模型,提高python处理大数据的性能。广泛应用于金融、经济、数据分析、统计等商业领域,为从业者提供了便捷。
特点:
- 支持Dataframe格式,自定义索引,Dataframe是一种高效快速的数据结构对象
- 可以将不同格式的数据文件加载到内存中
- 可处理时间序列或非时间序列数据
- 可基于标签来切片索引,获得大数据集子集
- 可进行高性能数据分组、聚合、添加、删除
- 未对齐及索引方式不同的数据可按轴自动对齐
- 灵活处理数据缺失、重组、空格
2、Pandas安装
# python -m pip会使用您指定为python的Python解释器来执行pip
python -m pip install pandas
3、Series数据结构
Series类似一维数组,数组由数据与其索引标签组成,索引在左侧,值在右侧。
3.1、创建Series数组
import pandas as pd
import numpy as np
# 创建Series数组
s1 = pd.Series([1,2,3,4])
print("s1:",s1)
# 创建Series数组并设置index参数
s2 = pd.Series([1,2,3,4],index=['一','二','三','四'])
print("s2:",s2)
3.2、Series的索引和切片
通过Series的value和index属性可以获取Series中的索引和数值
# Series索引和切片
print('s2的索引:',s2.index)
print('s2的值:',s2.values)
# 通过索引获取值或者修改(索引是不可以修改的)
# 单索引
print('s2中二对应的值',s2['二'])
s2['二'] = 5
print('s2中二对应的值',s2['二'])
# 多索引
print('s2中二、四对应的值',s2[['二','四']])
# 对于连续索引可以使用冒号
print('s2中二到四对应的值',s2['二':'四'])
3.3、字典类型数据创建Series
# 字典类型数据创建Series
week_dict = {'星期一':1,'星期二':2,'星期三':3,'星期四':4,'星期五':5,'星期六':6,'星期日':7}
s3 = pd.Series(week_dict)
print('s3: ',s3)
# 按照指定顺序将字典类型转换为Series
s4 = pd.Series(week_dict,index=['星期日','星期一','星期二','星期三','星期四','星期五','星期六'])
print('s4: ',s4)
# 查看某些元素是否在Series数组中
print('s4中含有星期八','星期八' in s4)
print('s4中不含有星期八','星期八' not in s4)
# 查看是否存在缺失值
s5 = pd.Series(week_dict,index=['星期八','星期一','星期二','星期三','星期四','星期五','星期六'])
print('s5: ',s5)
print('s5数据缺失',s5.isnull())
print('s5数据不缺失',s5.notnull())
3.4、Series的算术运算
# Series数组运算数据自动对齐(不存在的索引做NaN缺失处理)
print('s4+s5:',s4+s5)
4、DataFrame数据结构
DataFrame是二维表格型数据结构,行索引和列索引都有,每一列的元素可能是不同类型的数据
4.1、DataFrame的构建
# DataFrame的创建
student_dict={
'姓名':['张三','李四','王五','麻六'],
'性别':['男','女','女','男'],
'年龄':[20,18,21,22]
}
df = pd.DataFrame(student_dict)
print('df:',df)
# 指定columns的顺序
df2 = pd.DataFrame(student_dict,columns=['性别','年龄','姓名'])
print('df2:',df2)
# columns中含有值与字典key值不匹配时,NaN处理
df3 = pd.DataFrame(student_dict,columns=['性别','年龄','姓名','班级'])
print('df3:',df3)
#设置DataFrame的表头(列名称和行索引名称)
df3.index.name ='序列'
df3.columns.name = '属性'
print('df3:',df3)
# values函数获取DataFrame中所用数据
print('df3的values值:',df3.values)
4.2、DataFrame的索引
#列
print('df3中姓名列:',df3['姓名'])
print('df3中姓名列:',df3.姓名)
#行
print('df3中序号是2的行:',df3.loc[2])
#索引修改值
df3['班级'] =np.arange(4)
print('df3:',df3)
# 或者
df3['班级'] =pd.Series([2,4],index=[0,2])
print('df3:',df3)
# 不存在的columns赋值时会创建新列
df3['表现'] = pd.Series(['好','良好','良好','差'])
print('df3:',df3)
4.3、统计计算
常用的DataFrame数据统计函数:
函数 | 说明 |
---|---|
mean | 均值 |
median | 中位数 |
count | 非缺失值数量 |
min、max | 最小值、最大值 |
describe | 汇总统计 |
var | 方差 |
std | 标准差 |
skew | 偏度 |
kurt | 峰度 |
diff | 一阶差分 |
cummin、cummax | 累计最小值、累计最大值 |
cumsum、sumprod | 累计和、累计积 |
cov、corr | 协方差、相关系数 |
# DataFrame 统计运算
df4 = pd.DataFrame([[1,2,3,4],[4,3,2,1],[1,2,3,4],[4,3,2,1]],
index=['a','b','c','d'],columns=['一','二','三','四'])
print("df4:" ,df4)
# sum()求和(如果数据中存在缺失值,计算时会自动跳过缺失值)
print('df4按列求和:',df4.sum())
print('df4按行求和:',df4.sum(axis=1))
# cumsum() 累计求和
print('df4从上到下累计求和:',df4.cumsum())
print('df4从左到右累计求和:',df4.cumsum(axis=1))
......
其他函数自己实践
4.4、DataFrame的文件操作
- 读取文件
常用的读取文件函数(基于pandas):
函数 | 说明 |
---|---|
read_csv(filename) | 从csv文件读取数据,默认分隔符为, |
read_table(filename) | 从文本文件读取数据,默认分隔符为制表符 |
read_excel(filename) | 从Excel中读取数据 |
read_sql(query, connection_object) | 从SQL表/库读取数据 |
read_json(json_string) | 从json文件中读取数据 |
read_html(url) | 解析url、字符串或者html文件,提取数据表格 |
DataFrame(dict) | 从字典对象中读取数据 |
# 读取文件
df5 = pd.read_csv('df4.csv',encoding='utf-8')
print("df5:",df5)
- 写入文件
常用的写入文件函数(基于DataFrame):
函数 | 说明 |
---|---|
to_csv(filename) | 写入数据到csv文件 |
to_excel(filename) | 写入数据到Excel文件 |
to_sql(table_name,connection_object) | 写入数据到SQL表 |
to_json(filename) | 写入数据到json文件 |
to_html(filename) | 写入数据到html文件 |
to_clipboard(filename) | 写入数据到剪切贴板中 |
# 写文件
df4.to_csv('df4.csv',sep=',',encoding='utf-8')
5、数据处理
5.1、缺失值处理
缺失值在数据中的主要三种表现:
- 不存在型空值,无法获取的值
- 存在型空值,样本的该特征是存在的,只是暂时无法获取数据
- 占位型空值,无法确定是不存在型空值还是存在型空值,最不确定的一种
5.2、查找缺失值
# 查找缺失值
df6 = pd.DataFrame([[1,2,3,4],[4,np.nan,2,1],[1,2,np.nan,4],[4,3,2,1]],
index=['a','b','c','d'],columns=['一','二','三','四'])
print("df6:" ,df6)
print('判断df6中缺失值:',df6.isnull())
print('输出含有缺失值的行:',df6[df6.isnull().any(axis=1)])
5.3、过滤缺失值
# 过滤缺失值
df8 = pd.DataFrame([[1,2,3,4],[4,np.nan,2,1],[1,2,np.nan,4],[4,3,2,1]],
index=['a','b','c','d'],columns=['一','二','三','四'])
df7 = pd.Series([1,2,3,np.nan,5,6])
print("df7:",df7)
print("过滤df7缺失值:",df7.dropna())
print("df8:" ,df8)
print("过滤df8缺失值:",df8.dropna())
# 删除全为缺失值的行或者列
df8['五'] =np.NAN
print("df8:" ,df8)
print('删除全为缺失值的列:',df8.dropna(how='all',axis=1))
5.4、填充缺失值
# 填充缺失值
df9 = pd.DataFrame([[1,2,3,4],[4,np.nan,2,1],[1,2,np.nan,4],[4,3,2,1]],
index=['a','b','c','d'],columns=['一','二','三','四'])
print('df9:',df9)
print('使用0填充缺失值:',df9.fillna(0))
print('中位数填充缺失值:',df9.fillna(df9.median()))
print('向上填充缺失值:',df9.ffill())
print('向下填充缺失值:',df9.bfill())
5.5、重复值处理
- 查找重复值
- 去除重复值
# 查找重复值
df10 = pd.DataFrame([[1,2,3,4],[4,3,2,1],[1,2,3,4],[4,3,2,1]],
index=['a','b','c','d'],columns=['一','二','三','四'])
print('df10:',df10)
print('是否存在重复:',df10[df10.duplicated()])
print('是否前两列存在重复:',df10[df10.duplicated(subset=['一','二'])])
# 去除重复值
print('去除重复值:',df10.drop_duplicates(subset=['一','二'],keep='first'))
5.6、数据记录合并与分组
- 使用append函数合并数据
- 使用concat函数合并数据
- 使用merge函数合并数据
df11 = pd.DataFrame([[1,2,3,4],[2,3,2,1],[3,2,3,4],[4,3,2,1]],
index=['a','b','c','d'],columns=['一','二','三','四'])
df12 = pd.DataFrame([[1,6],[2,7],[3,8],[4,9]],
index=['a','b','c','d'],columns=['一','八'])
print('append函数合并记录:',df11.append(df12))
print('concat函数合并记录,df11和df12上下连接:',pd.concat([df11,df12]))
print('concat函数合并记录,df11和df12左右连接:',pd.concat([df11,df12],axis=1,sort=False))
print('merge函数合并记录:',pd.merge(df11,df12,left_on='一',right_on='一',how='left'))