Pandas教程:近万字讲解在Pandas中如何操作Excel

目录

1. 安装与配置

2. 读取Excel文件

2.1 基本用法

2.2 指定工作表

2.3 指定单元格范围

3. 数据检查与预处理

3.1 查看数据的基本信息

3.2 数据类型检查与转换

3.3 检查缺失值

3.4 处理缺失值

4. 数据清洗与转换

4.1 重命名列

4.2 删除重复数据

4.3 数据替换

4.4 数据排序

4.5 数据分组与聚合

5. 数据选择与过滤

5.1 按标签选择

5.2 按位置选择

5.3 布尔索引

5.4 多条件过滤

6. 数据操作

6.1 添加、删除列

6.2 数据框合并

6.3 数据透视表

6.4 交叉表

7. 写入Excel文件

7.1 基本用法

7.2 指定工作表名称

7.3 指定单元格位置

7.4 处理多个工作表

7.5 设置样式和格式

8. 实战项目

8.1 读取真实Excel数据集

8.2 数据清洗与预处理

8.3 数据分析与可视化

8.4 将结果写回Excel文件

9. 性能优化

9.1 数据取样

9.2 内存优化

9.3 矢量化操作

示例1:简单数学运算

示例2:应用自定义函数

示例3:条件操作

性能对比


在数据分析和处理领域,Excel文件是常见的数据存储格式之一。Pandas库提供了强大的功能来读取、处理和写入Excel文件。本文将详细介绍如何使用Pandas操作Excel文件,包括读取、数据清洗、数据操作和写入等步骤。

 

1. 安装与配置


首先,确保你已经安装了Pandas库以及用于读写Excel文件的库(如 openpyxlxlrd)。你可以使用以下命令进行安装:

pip install pandas openpyxl xlrd

 

2. 读取Excel文件


2.1 基本用法

使用 pd.read_excel() 函数可以从Excel文件中读取数据到DataFrame。以下是一个基本示例:

import pandas as pd# 读取Excel文件
df = pd.read_excel('data.xlsx')
print(df.head())

2.2 指定工作表

如果Excel文件包含多个工作表,可以使用 sheet_name 参数指定要读取的工作表:

# 读取名为 'Sheet1' 的工作表
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
print(df.head())

2.3 指定单元格范围

可以使用 usecols 参数指定要读取的列范围,使用 skiprowsnrows 参数指定要跳过的行和读取的行数:

# 读取第1到第3列,跳过前2行,读取10行
df = pd.read_excel('data.xlsx', usecols="A:C", skiprows=2, nrows=10)
print(df.head())

3. 数据检查与预处理


3.1 查看数据的基本信息

使用 head()tail()info()describe() 函数可以查看数据的基本信息:

print(df.head())  # 显示前5行
print(df.tail())  # 显示后5行
print(df.info())  # 显示数据类型和缺失值信息
print(df.describe())  # 显示统计信息

3.2 数据类型检查与转换

可以使用 dtypes 属性查看数据类型,并使用 astype() 函数进行类型转换:

print(df.dtypes)
df['Column1'] = df['Column1'].astype('int')

3.3 检查缺失值

使用 isnull()sum() 函数检查缺失值:

print(df.isnull().sum())

3.4 处理缺失值

可以使用 fillna() 函数填充缺失值,或使用 dropna() 函数删除包含缺失值的行或列:

# 填充缺失值
df.fillna(0, inplace=True)# 删除包含缺失值的行
df.dropna(inplace=True)

4. 数据清洗与转换


4.1 重命名列

使用 rename() 函数重命名列:

df.rename(columns={'OldName': 'NewName'}, inplace=True)

4.2 删除重复数据

使用 drop_duplicates() 函数删除重复数据:

df.drop_duplicates(inplace=True)

4.3 数据替换

使用 replace() 函数进行数据替换:

df['Column1'].replace(10, 20, inplace=True)

4.4 数据排序

使用 sort_values() 函数进行数据排序:

df.sort_values(by='Column1', ascending=False, inplace=True)

4.5 数据分组与聚合

使用 groupby()agg() 函数进行数据分组与聚合:

grouped = df.groupby('Category')
result = grouped['Value'].agg(['mean', 'sum'])
print(result)

5. 数据选择与过滤


5.1 按标签选择

使用 loc 按标签选择数据:

subset = df.loc[df['Column1'] > 10]
print(subset)

5.2 按位置选择

使用 iloc 按位置选择数据:

subset = df.iloc[0:5, 1:3]
print(subset)

5.3 布尔索引

使用布尔索引进行数据过滤:

subset = df[df['Column1'] > 10]
print(subset)

5.4 多条件过滤

使用多个条件进行数据过滤:

subset = df[(df['Column1'] > 10) & (df['Column2'] < 20)]
print(subset)

6. 数据操作


6.1 添加、删除列

使用 insert() 函数添加列,使用 drop() 函数删除列:

df.insert(1, 'NewColumn', [1, 2, 3, 4, 5])
df.drop(columns=['OldColumn'], inplace=True)

6.2 数据框合并

使用 concat()merge()join() 函数进行数据框合并:

# 使用 concat() 合并
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
result = pd.concat([df1, df2], ignore_index=True)# 使用 merge() 合并
df1 = pd.DataFrame({'key': ['K0', 'K1'], 'A': [1, 2]})
df2 = pd.DataFrame({'key': ['K0', 'K1'], 'B': [3, 4]})
result = pd.merge(df1, df2, on='key')# 使用 join() 合并
df1 = pd.DataFrame({'A': [1, 2]}, index=['K0', 'K1'])
df2 = pd.DataFrame({'B': [3, 4]}, index=['K0', 'K1'])
result = df1.join(df2)

6.3 数据透视表

使用 pivot_table() 函数创建数据透视表:

pivot_table = df.pivot_table(values='Value', index='Category', columns='Year', aggfunc='mean')
print(pivot_table)

6.4 交叉表

使用 crosstab() 函数创建交叉表:

crosstab = pd.crosstab(df['Category'], df['Year'])
print(crosstab)

7. 写入Excel文件


7.1 基本用法

使用 pd.DataFrame.to_excel() 函数将DataFrame写入Excel文件:

df.to_excel('output.xlsx', index=False)

7.2 指定工作表名称

可以使用 sheet_name 参数指定工作表名称:

df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)

7.3 指定单元格位置

可以使用 startrowstartcol 参数指定单元格位置:

df.to_excel('output.xlsx', startrow=1, startcol=2, index=False)

7.4 处理多个工作表

使用 ExcelWriter 类处理多个工作表:

with pd.ExcelWriter('output.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1', index=False)df2.to_excel(writer, sheet_name='Sheet2', index=False)

7.5 设置样式和格式

可以使用 openpyxl 库设置单元格样式和格式:

from openpyxl import Workbook
from openpyxl.styles import Fontwith pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:df.to_excel(writer, sheet_name='Sheet1', index=False)workbook = writer.bookworksheet = workbook['Sheet1']for cell in worksheet['A'] + worksheet['B']:cell.font = Font(bold=True)

8. 实战项目


为了使实战项目更具实际操作性,我们设计一个简单的Excel数据集,该数据集包含一些虚拟的销售数据。这个数据集将包括以下列:

  • Date:销售日期
  • Region:销售区域
  • Product:产品名称
  • Quantity:销售数量
  • Unit Price:单价
  • Sales:销售额(通过 Quantity 和 Unit Price 计算得出)

以下是这个数据集的示例数据:

DateRegionProductQuantityUnit PriceSales
2023-01-01NorthProductA1020200
2023-01-01SouthProductB1530450
2023-01-02EastProductA2020400
2023-01-02WestProductC2525625
2023-01-03NorthProductB3030900
2023-01-03SouthProductC3525875
2023-01-04EastProductA4020800
2023-01-04WestProductB45301350
2023-01-05NorthProductC50251250
2023-01-05SouthProductA55201100

你可以将以上数据保存到一个Excel文件中,例如 sales_data.xlsx,并使用以下Python代码来读取、处理和分析这些数据。

8.1 读取真实Excel数据集

读取一个包含销售数据的Excel文件:

import pandas as pd# 读取Excel文件
df = pd.read_excel('sales_data.xlsx')
print(df.head())

8.2 数据清洗与预处理

进行数据清洗和预处理,包括处理缺失值、重命名列、删除重复数据等:

# 检查缺失值并填充
df.fillna(0, inplace=True)# 重命名列
df.rename(columns={'Unit Price': 'Unit_Price'}, inplace=True)# 删除重复数据
df.drop_duplicates(inplace=True)

8.3 数据分析与可视化

进行数据分析和可视化,例如计算销售额总和并绘制图表:

import matplotlib.pyplot as plt# 计算总销售额
total_sales = df['Sales'].sum()
print(f'Total Sales: {total_sales}')# 按区域汇总销售额
region_sales = df.groupby('Region')['Sales'].sum()
print(region_sales)# 绘制销售额柱状图
region_sales.plot(kind='bar')
plt.xlabel('Region')
plt.ylabel('Total Sales')
plt.title('Total Sales by Region')
plt.show()

8.4 将结果写回Excel文件

将处理后的数据和分析结果写回Excel文件:

with pd.ExcelWriter('processed_sales_data.xlsx') as writer:df.to_excel(writer, sheet_name='Data', index=False)pd.DataFrame({'Total Sales': [total_sales]}).to_excel(writer, sheet_name='Summary', index=False)region_sales.to_excel(writer, sheet_name='Region Sales')

9. 性能优化


9.1 数据取样

对于大型数据集,可以使用 sample() 函数进行数据取样:

sampled_df = df.sample(n=1000)

9.2 内存优化

使用 memory_usage() 函数检查内存使用情况,并使用 astype() 函数优化数据类型:

print(df.memory_usage(deep=True))
df['Column1'] = df['Column1'].astype('int32')

9.3 矢量化操作

矢量化操作是指在操作数组或数据时,通过使用向量化函数(通常是数组级函数)来替代显式的循环,以实现更高效的计算。这种方法利用了底层C、Fortran等语言的高效实现,显著提升了计算速度。

在Pandas中,矢量化操作通常涉及对整个Series或DataFrame进行操作,而不需要显式地遍历每个元素。矢量化操作不仅使代码更简洁、更易读,还能大幅提高数据处理的性能。

使用矢量化操作提高性能,例如使用 apply() 函数进行批量操作:

df['NewColumn'] = df['Column1'].apply(lambda x: x * 2)

以下是一些矢量化操作的示例:

示例1:简单数学运算

假设我们有一个包含销售数量的Series,我们希望将每个销售数量乘以2。

传统方法(使用循环):

import pandas as pd# 创建示例数据
sales_quantities = pd.Series([10, 20, 30, 40, 50])# 使用循环进行操作
doubled_quantities = []
for quantity in sales_quantities:doubled_quantities.append(quantity * 2)doubled_quantities = pd.Series(doubled_quantities)
print(doubled_quantities)

矢量化方法:

# 使用矢量化操作
doubled_quantities = sales_quantities * 2
print(doubled_quantities)

示例2:应用自定义函数

假设我们有一个包含产品价格的DataFrame,我们希望对每个价格应用一个折扣函数。

传统方法(使用循环和apply):

import pandas as pd# 创建示例数据
data = {'Product': ['A', 'B', 'C'], 'Price': [100, 200, 300]}
df = pd.DataFrame(data)# 定义折扣函数
def apply_discount(price):return price * 0.9# 使用apply方法
df['Discounted_Price'] = df['Price'].apply(apply_discount)
print(df)

矢量化方法:

# 使用矢量化操作
df['Discounted_Price'] = df['Price'] * 0.9
print(df)

示例3:条件操作

假设我们有一个包含销售数据的DataFrame,我们希望根据销售额为每个记录添加一个“高销售”标签。

传统方法(使用循环):

import pandas as pd# 创建示例数据
data = {'Product': ['A', 'B', 'C'], 'Sales': [150, 300, 450]}
df = pd.DataFrame(data)# 使用循环进行操作
high_sales_label = []
for sales in df['Sales']:if sales > 200:high_sales_label.append('High')else:high_sales_label.append('Low')df['Sales_Label'] = high_sales_label
print(df)

矢量化方法:

# 使用矢量化操作
df['Sales_Label'] = df['Sales'].apply(lambda x: 'High' if x > 200 else 'Low')
print(df)

性能对比

矢量化操作通常比使用循环快得多,尤其是当数据量较大时。下面是一个简单的性能对比示例:

import pandas as pd
import numpy as np
import time# 创建大规模示例数据
data = np.random.randint(1, 100, size=1000000)
df = pd.DataFrame(data, columns=['Value'])# 使用循环进行操作
start_time = time.time()
doubled_values = []
for value in df['Value']:doubled_values.append(value * 2)
doubled_values = pd.Series(doubled_values)
print("Loop time:", time.time() - start_time)# 使用矢量化操作
start_time = time.time()
doubled_values = df['Value'] * 2
print("Vectorized time:", time.time() - start_time)

Loop time: 0.83 seconds
Vectorized time: 0.02 seconds


请注意,具体的时间取决于执行环境和硬件配置,但一般来说,矢量化操作的性能会显著优于显式循环。这个示例展示了在处理大数据集时,矢量化操作可以显著提升性能,通常会快一个数量级甚至多个数量级。使用矢量化操作不仅使代码更加简洁和易读,还能显著提高数据处理的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android使用ANativeWindow更新surfaceView内容最简Demo

SurfaceView简介 SurfaceView对比View的区别 安卓的普通VIew,都依赖于当前Activity的Window的surface&#xff0c;这个surface用于承载view树从底到顶绘制出来的所有内容&#xff0c;因此任何一个view需要更新时&#xff0c;都需要把所有view中底到顶进行更新&#xff0c;即使使…

解决:Linux上SVN 1.12版本以上无法直接存储明文密码

问题&#xff1a;今天在Linux机器上安装了SVN&#xff0c;作为客户端使用&#xff0c;首次执行SVN相关操作&#xff0c;输入账号密码信息后&#xff0c;后面再执行SVN相关操作&#xff08;比如"svn update"&#xff09;还是每次都需要输入密码。 回想以前在首次输入…

Python进阶(4)--正则表达式

正则表达式 在Python中&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前&#xff0c;还记得之前我们是通过什么方法分割…

实习问题总结

为什么使用GRPC作为通信方式&#xff0c;对比如REST好处在哪里&#xff1f; 使用protobuf作为序列化格式&#xff0c;以二进制进行传输&#xff0c;减小了数据包的大小&#xff0c;效率高 proto强类型定义、支持复杂数据类型&#xff0c;编译运行可以进行严格的数据验证&#…

[论文笔记] pai-megatron-patch Qwen2-CT 长文本rope改yarn

更改: # Copyright (c) 2024 Alibaba PAI and Nvidia Megatron-LM Team. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License a…

【系统架构设计】数据库系统(二)

数据库系统&#xff08;二&#xff09; 数据库模式与范式数据库设计数据库设计的方法数据库设计的基本步骤 事务管理并发控制故障和恢复 备份与恢复分布式数据库系统数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库设计 数据库设计的方法 目前已有的数据库设计方法可分…

element UI :el-table横向列内容超出宽度,滚动条不显示问题

是否能解决你问题的前提 **看到这篇文章的解决问题的方案之前&#xff0c;请先回忆你是否在项目中的全局样式或者私有组件中去单独设置过滚动条样式。如果有 请继续往下看&#xff1a;**单独设置过滚动条样式代码实例&#xff1a; ::-webkit-scrollbar {/*滚动条整体样式*/wi…

layui 让table里的下拉框不被遮挡

记录&#xff1a;layui 让table里的下拉框不被遮挡 /* 这个是让table里的下拉框不被遮挡 */ .goods_table .layui-select-title,.goods_table .layui-select-title input{line-height: 28px;height: 28px; }.goods_table .layui-table-cell {overflow: visible !important; }.…

H-Instructions Substring(牛客暑期第二场)

题意&#xff1a;刚开始red站在初始位置&#xff08;0&#xff0c;0&#xff09;&#xff0c;她有一串指令&#xff1a;向上&#xff0c;向下&#xff0c;向左&#xff0c;向右&#xff08;上将y&#xff0c;下将y--&#xff0c;左x--&#xff0c;右x&#xff09;,可以选择连续…

【Gitlab】记一次升级 Gitlab 后 API 失效的问题

背景 前段时间&#xff0c;因内部使用的 Gitlab 版本存在漏洞&#xff0c;需要进行升级&#xff0c;于是乎&#xff0c;将 Gitlab 从 16.6.0 升级到 16.11.3。而我们项目有个接口是用于获取 Gitlab 上的开发人员。 然后&#xff0c;今天&#xff0c;突然发现这个接口获取不到…

【Django】网上蛋糕项目商城-注册,登录,修改用户信息,退出功能

概念 通过以上多篇文章的讲解&#xff0c;对该项目的功能已经实现了很多&#xff0c;本文将对该项目的用户注册&#xff0c;登录&#xff0c;修改用户信息&#xff0c;以及退出等功能的实现。 注册功能实现 点击head.html头部页面的注册按钮&#xff0c;触发超链接跳转至use…

十一、集合操作

一、集合定义 语法 创建集合使⽤ {} 或 set() 功能 集合可以去掉重复数据&#xff1b;集合数据是⽆序的&#xff0c;故不⽀持下标 s1 set(eqweqwe) s2 {} s3 {10, 20, 30, 40, 50} s4 {"name":"xuxu"} print(s1) print(type(s1)) print(type(s2)) pri…

[Python][自然语言]利用NLTK建立自己的情感分析模型

文章目录 相关python模块步骤一:准备自己的训练数据步骤二:读取并处理数据步骤三:特征提取步骤四:训练机器学习模型步骤五:部署模型相关python模块 pip install pandas pip install scikit-learn pip install nltk 当前使用版本 Python 3.10.12 scikit-learn 1.2.2 pand…

操作系统发展简史(Unix/Linux 篇 + DOS/Windows 篇)+ Mac 与 Microsoft 之风云争霸

操作系统发展简史&#xff08;Unix/Linux 篇&#xff09; 说到操作系统&#xff0c;大家都不会陌生。我们天天都在接触操作系统 —— 用台式机或笔记本电脑&#xff0c;使用的是 windows 和 macOS 系统&#xff1b;用手机、平板电脑&#xff0c;则是 android&#xff08;安卓&…

Symfony数据库抽象层:深入理解其工作原理

在现代Web应用开发中&#xff0c;数据库是不可或缺的一部分。Symfony框架提供了一个强大且灵活的数据库抽象层&#xff08;DBAL&#xff09;&#xff0c;使得开发者能够轻松地与各种类型的数据库进行交互。本文将深入探讨Symfony数据库抽象层的工作原理&#xff0c;并展示一些示…

来聊聊去中心化Redis集群节点如何完成通信

写在文章开头 今天我们来聊点有意思的&#xff0c;关于redis中集群间通信的设计与实现&#xff0c;本文将从源码的角度分析redis集群节点如何利用Gossip协议完成节点间的通信与传播&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术…

ARM/Linux嵌入式面经(十六):蔚来嵌入式一二三面面经

文章目录 static作用,局部static和全局static区别TCP三次握手Linux虚拟内存指针引用区别C++内存分区new/delete和malloc/free区别职业规划为什么选择蔚来介绍一下项目然后问我有没有内核级别开发经验,我说没有什么情况进入内核态一、主动式二、被动式三、其他方式注意事项示例…

MAVSKD-Java开源库mavsdk_server库macOS平台编译

1.下载源码 2.使用IDEA打开,进行mavsdk_server目录,使用gradle进行编译 3.开始编译时会自动下载依赖 4.下载完成后,会自动编译 5.编译成功 6.成功生成AAR文件

2024算力基础设施安全架构设计与思考(免费下载)

算网安全体系是将数据中心集群、算力枢纽、一体化大数据中心三个层级的安全需求进行工程化解耦&#xff0c;从国家安全角度统筹设计&#xff0c;通过安全 服务化方式&#xff0c;依托威胁情报和指挥协同通道将三层四级安全体系串联贯通&#xff0c;达成一体化大数据安全目标。 …

文件IO(Ubuntu)

文件IO 目的 将数据写入文件中 与标准IO的区别 &#xff08;为什么要学习文件IO&#xff09; 标准IO只能操作普通文件和特殊的管道文件 文件IO能操作几乎所有的的文件 缓存区的目的 标准IO有缓存区 文件IO没有缓存区 根据右图描述 标准IO 文件IO buffer缓存区 有缓存区…