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'))