接上篇《60、Pandas中DataFrame对象的操作(一)》
上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。
一、DataFrame的统计分析
在数据分析和处理中,Pandas的DataFrame提供了强大的统计分析功能,帮助我们深入理解数据的分布、趋势和特征。以下将详细介绍描述性统计、分组聚合以及数据透视表等关键功能。
1、描述性统计
描述性统计是数据分析的第一步,它通过计算一系列统计量来概括数据的中心趋势、离散程度和分布形态。在Pandas中,我们可以轻松地对DataFrame中的数值列进行描述性统计分析。
●计算均值(Mean):均值是所有观测值的算术平均值,能够反映数据的中心位置。使用.mean()方法计算DataFrame中所有数值列的均值,或者通过指定列名来计算特定列的均值。
●计算中位数(Median):中位数是将一组数据从小到大排列后,位于中间位置的数。当数据中存在极端值时,中位数比均值更能反映数据的中心趋势。使用.median()方法计算中位数。
●计算众数(Mode):众数是数据集中出现次数最多的数。Pandas的DataFrame没有直接的.mode()方法来计算众数,但可以使用scipy.stats.mode或pandas.Series.mode()(对于Series)来实现。对于DataFrame,通常需要先选择一列,然后应用此方法。
●计算标准差(Standard Deviation):标准差是衡量数据离散程度的一种指标,表示数据点与均值的平均距离。使用.std()方法计算标准差。
# 示例代码
import pandas as pd
import numpy as np# 创建一个包含不同类型数据的表
data = {'编号': [1, 2, 3, 4, 5, 6],'姓名': ['张三', '李四', '王五', '赵六', '孙七', '李雷'],'年龄': [25, 30, 28, 22, 35, 25],'薪资': [50000, 60000, 70000, 80000, 40000, 50000],'入职日期': ['2020-01-01', '2021-02-15', '2022-03-01', '2021-04-15', '2020-05-01', '2020-01-01'], # 日期时间字符串'类别': ['A', 'B', 'A', 'C', 'C', 'A'] # 分类数据
}# 将数据字典转换为DataFrame
df = pd.DataFrame(data)print("薪资列均值:", df['薪资'].mean())
print("年龄中位数:", df['年龄'].median())
# 对于众数,需要先选择一列
mode_val = df['类别'].mode()[0]
print("类别众数:", mode_val)
print("薪资标准差", df['薪资'].std())
测试结果:
2、分组聚合
分组聚合是数据分析中常用的技术,它允许我们将数据按照一个或多个键进行分组,然后对每个组应用聚合函数来计算统计量。
●使用groupby()方法进行分组:groupby()方法根据一个或多个列的值将数据分成多个组。分组后,可以使用聚合函数对每组数据进行操作。
●聚合函数:Pandas提供了多种聚合函数,如sum()(求和)、mean()(均值)、count()(计数)、max()(最大值)、min()(最小值)等。这些函数可以直接应用于groupby()的结果上。
# 分组求和
grouped_sum = df.groupby('类别').sum()
print("分组求和(薪资为例):")
print(grouped_sum[['薪资']])# 分组计算均值,仅对数值列操作
numeric_cols = ['年龄', '薪资'] # 指定要计算的数值列
grouped_mean = df.groupby('类别')[numeric_cols].mean()print("分组计算均值(薪资和年龄为例):")
print(grouped_mean)
测试结果:
3、数据透视表
数据透视表是一种强大的数据分析工具,它能够以表格的形式展示数据的分组汇总信息,便于进行数据的比较和分析。使用pivot_table()方法创建数据透视表:pivot_table()方法能够根据一个或多个键对数据进行分组,并对每个组应用聚合函数来计算统计量。与groupby()相比,pivot_table()提供了更灵活的布局选项,如指定行索引、列索引和值。
# 示例代码
# 创建一个示例DataFrame
data2 = {'产品': ['苹果', '香蕉', '苹果', '橙子', '香蕉', '苹果', '橙子', '香蕉'],'地区': ['北方', '南方', '北方', '北方', '南方', '南方', '南方', '北方'],'销售量': [50, 60, 70, 80, 90, 100, 110, 120],'销售额': [250, 300, 350, 400, 450, 500, 550, 600]
}df = pd.DataFrame(data2)# 打印原始DataFrame
print("原始DataFrame:")
print(df)# 创建数据透视表
# 索引为'产品',列为'地区',聚合函数为sum(对销售量和销售额进行求和)
pivot_table = pd.pivot_table(df, values=['销售量', '销售额'], index=['产品'], columns=['地区'], aggfunc='sum')# 打印数据透视表
print("\n数据透视表:")
print(pivot_table)
测试效果:
在上面的代码中,values参数指定了要汇总的列,index参数指定了行索引列,columns参数指定了列索引列,aggfunc参数指定了聚合函数。通过这种方式,我们可以轻松地创建出复杂的数据透视表,以满足不同的数据分析需求。
二、DataFrame的可视化
在数据分析和数据科学领域,数据可视化是理解数据分布、趋势和关系的关键步骤。Pandas库虽然主要聚焦于数据处理,但它与强大的可视化库(如Matplotlib和Seaborn)的无缝集成,使得从数据处理到数据可视化的流程变得极为顺畅。以下将详细介绍如何使用Pandas结合Matplotlib和Seaborn库进行DataFrame的可视化。
1、整合Matplotlib进行绘图
Matplotlib是Python中最基础且广泛使用的绘图库之一,它提供了大量的绘图功能,能够生成出版级别的图表。Pandas的DataFrame和Series对象可以直接与Matplotlib集成,方便地将数据转换为图形。
(1)绘制柱状图
柱状图是展示分类数据(如不同类别的销售量)的一种直观方式。
import pandas as pd
import matplotlib.pyplot as plt# 示例数据
data = {'产品': ['苹果', '香蕉', '橙子'], '销售量': [100, 150, 120]}
df = pd.DataFrame(data)# 设置Matplotlib支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号'-'显示为方块的问题# 绘制柱状图
df.plot(kind='bar', x='产品', y='销售量')
plt.title('产品销售量')
plt.xlabel('产品')
plt.ylabel('销售量')
plt.show()
测试效果:
(2)绘制折线图
折线图常用于展示时间序列数据或连续变量的变化趋势。
# 假设我们有时间序列数据
data = {'日期': ['2023-01', '2023-02', '2023-03'], '销售额': [200, 250, 300]}
df = pd.DataFrame(data)
df['日期'] = pd.to_datetime(df['日期']) # 确保日期是datetime类型 # 绘制折线图
df.plot(kind='line', x='日期', y='销售额')
plt.title('销售额变化趋势')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.xticks(rotation=45) # 旋转x轴标签以便阅读
plt.show()
测试效果:
(3)绘制饼图
饼图用于展示各部分在整体中的比例。
# 使用之前的销售数据
df.plot(kind='pie', y='销售量', labels=df['产品'], autopct='%1.1f%%')
plt.title('产品销售量比例')
plt.ylabel('') # 饼图通常不需要y轴标签
plt.show()
测试效果:
2、使用Seaborn库进行更高级的可视化
Seaborn是基于Matplotlib的高级绘图库,它提供了更多的绘图功能和更美观的默认样式,与Pandas的集成也非常方便。
Seaborn能够自动处理Pandas DataFrame的索引和列名,使得绘图过程更加简洁。同时,Seaborn提供了多种类型的图表,如散点图、箱型图、热力图等,以及用于统计分析和数据探索的功能。
(1)散点图
散点图用于展示两个变量之间的关系。
import seaborn as sns # 假设我们有两个变量
data = {'体重': [50, 60, 70, 80, 90], '身高': [160, 170, 180, 190, 200]}
df = pd.DataFrame(data) # 绘制散点图
sns.scatterplot(x='身高', y='体重', data=df)
plt.title('身高与体重的关系')
plt.show()
测试结果:
(2)箱型图
箱型图用于展示数据的分布,包括中位数、四分位数、异常值等。
# 使用之前的销售数据
sns.boxplot(x='产品', y='销售量', data=df)
plt.title('产品销售量的分布情况')
plt.show()
测试结果:
(3)热力图
热力图用于展示矩阵数据中的数值大小,常用于展示相关性矩阵或频率矩阵。
# 绘制热力图
# 创建数据集
data = {'助攻数': [4, 5, 5, 6, 7, 8, 8, 10],'篮板数': [12, 14, 13, 7, 8, 8, 9, 13],'得分': [22, 24, 26, 26, 29, 32, 20, 14]}
df = pd.DataFrame(data)# 计算相关矩阵
corr_matrix = df.corr()# 显示结果,保留三位小数
print(corr_matrix.round(3))# 绘制热力图
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()
测试结果:
通过以上示例,我们可以看到Pandas结合Matplotlib和Seaborn库能够轻松实现DataFrame的可视化,无论是基础的图表类型还是更高级的数据可视化需求,都能轻松展示。
三、DataFrame的导出与保存
1、导出为CSV文件
CSV(Comma-Separated Values)是一种常用的文本文件格式,用于存储表格数据,包括数字、文本等。Pandas提供了to_csv()方法,可以方便地将DataFrame导出为CSV文件。●基本用法:
import pandas as pd# 创建一个包含不同类型数据的表
data = {'编号': [1, 2, 3, 4, 5, 6],'姓名': ['张三', '李四', '王五', '赵六', '孙七', '李雷'],'年龄': [25, 30, 28, 22, 35, 25],'薪资': [50000, 60000, 70000, 80000, 40000, 50000],'入职日期': ['2020-01-01', '2021-02-15', '2022-03-01', '2021-04-15', '2020-05-01', '2020-01-01'], # 日期时间字符串'类别': ['A', 'B', 'A', 'C', 'C', 'A'] # 分类数据
}# 将数据字典转换为DataFrame
df = pd.DataFrame(data)df.to_csv('data.csv', index=False) # index=False表示不保存行索引
●高级选项:
sep:指定字段分隔符,默认为逗号,。
encoding:指定文件的编码格式,如utf-8。
columns:指定要导出的列,通过列名列表实现。
header:是否写入列名作为文件头部,默认为True。
效果:
2、导出为Excel文件
Excel文件因其良好的兼容性和用户友好的界面,在数据分析领域广受欢迎。Pandas通过to_excel()方法支持将DataFrame导出为Excel文件,但需要注意的是,这要求安装了openpyxl或xlwt库作为引擎。
●安装必要的库(如果尚未安装):
pip install openpyxl
●基本用法:
df.to_excel('data.xlsx', index=False, engine='openpyxl')
●高级选项:
sheet_name:指定工作表名,默认为'Sheet1'。
startrow和startcol:指定开始写入的行和列(从0开始计数)。
float_format:浮点数的格式化字符串,如'%.2f'表示保留两位小数。
测试效果:
3、导出为其他格式(可选)
Pandas不仅限于导出为CSV和Excel文件,还支持多种其他格式,如SQL数据库、JSON文件等,这为数据分析师提供了极大的灵活性。
●导出到SQL数据库:
使用to_sql()方法可以将DataFrame直接保存到SQL数据库中。这需要先安装数据库连接库(如sqlalchemy和相应的数据库驱动)。
from sqlalchemy import create_engine # 创建数据库连接引擎
engine = create_engine('sqlite:///mydatabase.db') # 将DataFrame保存到SQL表
df.to_sql('tablename', con=engine, if_exists='replace', index=False)
●导出为JSON文件:
JSON格式因其轻量级和易于阅读的特性,在Web开发中广泛应用。Pandas的to_json()方法可以将DataFrame转换为JSON格式的字符串或文件。
# 导出为JSON字符串
json_str = df.to_json(orient='records')# 或直接写入文件
df.to_json('data.json', orient='records', lines=True)
orient参数控制JSON对象的结构,常见的选项有'split', 'records', 'index', 'columns', 'values', 和 'table'。
测试效果:
至此,关于DataFrame对象的统计分析、可视化以及数据导出与保存相关内容已介绍完毕,下一篇我们来讲解DataFrame对象的案例实践。
转载请注明出处:https://guangzai.blog.csdn.net/article/details/140753857