当前位置: 首页 > news >正文

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity + Hybridclr + Addressable + 微信小程序 热更新报错
  • Lua 类管理器
  • ChatTTS(文本转语音) 一键本地安装爆火语音模型
  • 微信公众号获取用户openid(PHP版,snsapi_base模式)
  • 【vluhub】zabbix漏洞
  • Minos 多主机分布式 docker-compose 集群部署
  • C语言玩一下标准输出——颜色、闪烁、加粗、下划线属性
  • Flink SQL 的工作机制
  • C++学习笔记——模板
  • UNIX 域协议
  • 从零到一使用 Ollama、Dify 和 Docker 构建 Llama 3.1 模型服务
  • 【Golang 面试 - 基础题】每日 5 题(十)
  • AIGC-VDM -Video Diffusion Models论文解读
  • CeoMax总裁主题最新3.8.1破解免授权版/WordPress付费资源素材下载主题
  • PHP完整表单实例
  • 0基础学习移动端适配
  • Cumulo 的 ClojureScript 模块已经成型
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java应用性能调优
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Js基础——数据类型之Null和Undefined
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • opencv python Meanshift 和 Camshift
  • PAT A1050
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 大整数乘法-表格法
  • 后端_MYSQL
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 容器服务kubernetes弹性伸缩高级用法
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 网页视频流m3u8/ts视频下载
  • 一份游戏开发学习路线
  • ​520就是要宠粉,你的心头书我买单
  • ​ssh免密码登录设置及问题总结
  • #APPINVENTOR学习记录
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #mysql 8.0 踩坑日记
  • $L^p$ 调和函数恒为零
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (poj1.3.2)1791(构造法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (九十四)函数和二维数组
  • (算法)Game
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (转)visual stdio 书签功能介绍
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)从 Java 代码到 Java 堆
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .net访问oracle数据库性能问题
  • .NET应用架构设计:原则、模式与实践 目录预览