python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Pandas处理Excel数据

Python自动化办公之使用Pandas玩转Excel数据处理全攻略

作者:小庄-Python办公

在现代办公环境中,Excel无疑是最常用的数据管理工具之一,Pandas提供了一套高性能、易于使用的数据结构和数据分析工具,能够让你以编程的方式高效地读取、处理、分析乃至写入Excel文件,下面我们就来看看如何使用Pandas玩转Excel数据处理吧

引言

在现代办公环境中,Excel无疑是最常用的数据管理工具之一。然而,当数据量庞大、操作重复性高时,手动处理Excel表格不仅效率低下,还极易出错。这时,Python的强大功能就显得尤为重要,特别是其数据分析利器——Pandas库。

Pandas提供了一套高性能、易于使用的数据结构和数据分析工具,能够让你以编程的方式高效地读取、处理、分析乃至写入Excel文件。对于希望提升办公效率、摆脱繁琐重复工作的你来说,学习如何使用Pandas操作Excel,无疑是一项极具价值的技能。

本篇博客将作为你的Pandas操作Excel入门指南,从最基础的数据读取开始,逐步深入到数据的查看、选择、清洗、排序、筛选、应用函数,最终实现将处理后的数据写入新的Excel文件。无论你是完全的编程新手,还是对Python自动化办公充满好奇,都将通过本文获得扎实的实践基础。

让我们一起踏上这段高效办公的自动化之旅吧!

前置准备

在开始之前,请确保你的计算机上已经安装了Python环境,并且安装了本教程所需的关键库。

1. 安装Python

如果你尚未安装Python,推荐访问Python官方网站下载并安装最新版本。安装时请务必勾选“Add Python to PATH”选项。

2. 安装Pandas和Excel读写库

Pandas本身不直接支持Excel文件的读写,它依赖于其他库来完成这项工作。对于.xlsx格式的Excel文件(新版Excel),我们需要安装openpyxl;对于.xls格式的Excel文件(旧版Excel),则需要xlrd。通常,我们都会安装openpyxl

打开你的命令行工具(Windows用户是cmdPowerShell,macOS/Linux用户是Terminal),运行以下命令进行安装:

pip install pandas openpyxl

安装成功后,你就可以开始使用Pandas了。

实战演练:Pandas操作Excel的八大核心技能

为了更好地演示Pandas的功能,我们首先需要一个示例Excel文件。

准备工作:创建示例Excel文件

请在你的工作目录下创建一个名为员工信息.xlsx的Excel文件,并填入以下内容:

员工信息.xlsx

员工ID姓名部门职位入职日期工资绩效等级
1001张三销售部销售经理2020-01-018000A
1002李四市场部市场专员2021-03-156500B
1003王五销售部销售代表2022-07-205000C
1004赵六研发部软件工程师2019-11-0112000A
1005孙七市场部市场经理2018-05-109000A
1006周八销售部销售代表2023-01-015200B
1007吴九研发部高级工程师2017-09-0115000A
1008郑十市场部市场专员2023-02-016000C
1009陈十一销售部NaN2022-04-015500B
1010钱十二研发部软件工程师2021-08-0111000NaN

其中,NaN表示缺失值。

现在,我们可以开始用Python和Pandas操作这个文件了。

import pandas as pd

# 定义Excel文件路径
file_path = '员工信息.xlsx'

1. 读取Excel文件

读取Excel文件是所有操作的第一步。Pandas提供了read_excel()函数来轻松完成这项任务。

# 读取整个Excel文件的第一个工作表
df = pd.read_excel(file_path)
print("------ 原始数据框 ------")
print(df)

# 读取指定工作表 (如果Excel文件有多个工作表,例如:sheet_name='Sheet2')
# df_sheet2 = pd.read_excel(file_path, sheet_name='Sheet2')
# print("\n------ Sheet2 数据框 ------")
# print(df_sheet2)

# 读取时指定某一列作为索引 (例如:员工ID作为索引)
# df_indexed = pd.read_excel(file_path, index_col='员工ID')
# print("\n------ 以员工ID为索引的数据框 ------")
# print(df_indexed)

解释:

2. 查看数据

读取数据后,我们需要快速了解数据的概况,包括其结构、内容、数据类型等。

print("\n------ 查看数据概况 ------")

# 查看前5行数据 (默认值)
print("\n前5行数据:")
print(df.head())

# 查看后3行数据
print("\n后3行数据:")
print(df.tail(3))

# 查看数据框的维度 (行数, 列数)
print("\n数据框维度 (行数, 列数):", df.shape)

# 查看所有列名
print("\n所有列名:", df.columns.tolist())

# 查看数据框的简要信息,包括列名、非空值数量、数据类型和内存占用
print("\n数据框信息:")
df.info()

# 查看数值列的描述性统计信息 (计数、均值、标准差、最小值、25/50/75分位数、最大值)
print("\n数值列描述性统计:")
print(df.describe())

# 查看所有列的描述性统计信息 (包括非数值列)
print("\n所有列描述性统计:")
print(df.describe(include='all'))

解释:

3. 选择数据

在数据处理中,我们经常需要选择特定的列或行进行操作。Pandas提供了多种方式来实现这一点。

print("\n------ 选择数据 ------")

# 选择单列:返回一个Series
print("\n选择'姓名'列:")
print(df['姓名'])

# 选择多列:返回一个DataFrame
print("\n选择'姓名'和'工资'列:")
print(df[['姓名', '工资']])

# 使用.loc[]按标签选择行和列 (loc[行标签, 列标签])
# 选择第0行到第2行 (包含) 的所有列
print("\n使用.loc[]选择前3行:")
print(df.loc[0:2])

# 选择'张三'和'李四'的'姓名'和'部门' (需要先将姓名设为索引)
# df_indexed_name = df.set_index('姓名')
# print("\n以姓名为索引,选择'张三'和'李四'的'姓名'和'部门':")
# print(df_indexed_name.loc[['张三', '李四'], ['部门', '职位']])

# 使用.iloc[]按位置选择行和列 (iloc[行位置, 列位置])
# 选择第0行到第2行 (不包含) 的所有列
print("\n使用.iloc[]选择前3行:")
print(df.iloc[0:3])

# 选择第0行和第2行,以及第1列和第3列
print("\n使用.iloc[]选择特定行和列 (0,2行;1,3列):")
print(df.iloc[[0, 2], [1, 3]]) # 对应 '姓名', '职位'

解释:

4. 数据清洗

真实世界的数据往往是不完美的,可能包含缺失值、重复值或错误的数据类型。数据清洗是数据分析的关键步骤。

print("\n------ 数据清洗 ------")

# 检查缺失值
print("\n各列缺失值数量:")
print(df.isnull().sum())

# 填充缺失值 (例如:职位缺失填充为'待定', 绩效等级缺失填充为'D')
df_filled = df.copy() # 创建副本,避免修改原始DataFrame
df_filled['职位'].fillna('待定', inplace=True)
df_filled['绩效等级'].fillna('D', inplace=True)
print("\n填充缺失值后的数据:")
print(df_filled)

# 删除包含缺失值的行
df_dropna_rows = df.dropna()
print("\n删除包含缺失值的行后的数据:")
print(df_dropna_rows)

# 删除包含缺失值的列 (如果某一列的缺失值过多)
# df_dropna_cols = df.dropna(axis=1)
# print("\n删除包含缺失值的列后的数据:")
# print(df_dropna_cols)

# 检查重复行
print("\n重复行数量:", df.duplicated().sum())

# 删除重复行
# 为了演示,我们先创建一个有重复行的DataFrame
data_with_duplicates = {
    'A': [1, 2, 2, 3, 4],
    'B': ['x', 'y', 'y', 'z', 'w']
}
df_dup = pd.DataFrame(data_with_duplicates)
print("\n原始带重复值数据:\n", df_dup)
df_no_dup = df_dup.drop_duplicates()
print("\n删除重复值后的数据:\n", df_no_dup)

# 数据类型转换 (例如:将'工资'列转换为整数类型)
# 注意:如果列中包含非数字值,转换会报错,需要先处理
df_cleaned = df_filled.copy() # 使用填充过缺失值的df
df_cleaned['工资'] = df_cleaned['工资'].astype(int)
print("\n'工资'列数据类型转换为int后的数据信息:")
df_cleaned.info()

解释:

5. 数据排序

对数据进行排序是常见的需求,例如按工资高低、入职时间先后等。

print("\n------ 数据排序 ------")

# 按'工资'列升序排序
df_sorted_salary_asc = df_cleaned.sort_values(by='工资', ascending=True)
print("\n按'工资'升序排序:")
print(df_sorted_salary_asc)

# 按'入职日期'降序排序
df_sorted_date_desc = df_cleaned.sort_values(by='入职日期', ascending=False)
print("\n按'入职日期'降序排序:")
print(df_sorted_date_desc)

# 多列排序:先按'部门'升序,再按'工资'降序
df_sorted_multi = df_cleaned.sort_values(by=['部门', '工资'], ascending=[True, False])
print("\n按'部门'升序,'工资'降序排序:")
print(df_sorted_multi)

解释:

.sort_values(by='列名', ascending=True/False):根据指定列的值进行排序。

6. 数据筛选

数据筛选是根据特定条件从DataFrame中选择子集的过程,非常灵活和强大。

print("\n------ 数据筛选 ------")

# 筛选'部门'为'销售部'的员工
sales_employees = df_cleaned[df_cleaned['部门'] == '销售部']
print("\n'销售部'的员工:")
print(sales_employees)

# 筛选'工资'大于等于8000的员工
high_salary_employees = df_cleaned[df_cleaned['工资'] >= 8000]
print("\n工资大于等于8000的员工:")
print(high_salary_employees)

# 多条件筛选:'部门'为'市场部' 且 '绩效等级'为'A'的员工
market_a_employees = df_cleaned[(df_cleaned['部门'] == '市场部') & (df_cleaned['绩效等级'] == 'A')]
print("\n'市场部'且'绩效等级'为'A'的员工:")
print(market_a_employees)

# 多条件筛选:'部门'为'销售部' 或 '部门'为'研发部'的员工
sales_or_rd_employees = df_cleaned[(df_cleaned['部门'] == '销售部') | (df_cleaned['部门'] == '研发部')]
print("\n'销售部'或'研发部'的员工:")
print(sales_or_rd_employees)

# 使用.isin()筛选:'部门'在列表['销售部', '市场部']中的员工
selected_departments = df_cleaned[df_cleaned['部门'].isin(['销售部', '市场部'])]
print("\n部门在['销售部', '市场部']中的员工:")
print(selected_departments)

# 筛选包含特定字符串的行 (例如:职位包含'经理')
# 注意:使用.str访问字符串方法
manager_employees = df_cleaned[df_cleaned['职位'].str.contains('经理', na=False)] # na=False 处理 NaN 值
print("\n职位包含'经理'的员工:")
print(manager_employees)

解释:

7. 应用函数

Pandas允许你对DataFrame的列或整个DataFrame应用函数,进行更复杂的数据转换和计算。

print("\n------ 应用函数 ------")

# 对单列应用函数:例如,计算年终奖 (假设为月工资的2倍)
df_processed = df_cleaned.copy()
df_processed['年终奖'] = df_processed['工资'] * 2
print("\n添加'年终奖'列:")
print(df_processed[['姓名', '工资', '年终奖']])

# 使用apply()对单列应用自定义函数 (例如:将绩效等级转换为数值)
def convert_performance(grade):
    if grade == 'A':
        return 3
    elif grade == 'B':
        return 2
    elif grade == 'C':
        return 1
    else: # D或其他
        return 0

df_processed['绩效分数'] = df_processed['绩效等级'].apply(convert_performance)
print("\n添加'绩效分数'列:")
print(df_processed[['姓名', '绩效等级', '绩效分数']])

# 使用lambda函数进行快速计算 (例如:计算税前总收入)
df_processed['税前总收入'] = df_processed.apply(lambda row: row['工资'] + row['年终奖'], axis=1)
print("\n添加'税前总收入'列:")
print(df_processed[['姓名', '工资', '年终奖', '税前总收入']])

# 对多列进行批量操作 (例如:所有数值列乘以100)
# numeric_cols = df_processed.select_dtypes(include=['int64', 'float64']).columns
# df_processed[numeric_cols] = df_processed[numeric_cols].apply(lambda x: x * 100)
# print("\n数值列乘以100后的数据 (部分):")
# print(df_processed[numeric_cols].head())

解释:

8. 写入Excel文件

完成所有数据处理后,你可能需要将结果保存到新的Excel文件中。

print("\n------ 写入Excel文件 ------")

output_file_path = '处理后的员工信息.xlsx'

# 将处理后的DataFrame写入新的Excel文件
# index=False 意味着不将DataFrame的索引写入Excel的第一列
df_processed.to_excel(output_file_path, index=False)
print(f"\n数据已成功写入 '{output_file_path}'")

# 将多个DataFrame写入同一个Excel文件的不同工作表
output_multi_sheet_file = '多工作表员工信息.xlsx'
with pd.ExcelWriter(output_multi_sheet_file) as writer:
    df_processed.to_excel(writer, sheet_name='所有员工', index=False)
    sales_employees.to_excel(writer, sheet_name='销售部员工', index=False)
    high_salary_employees.to_excel(writer, sheet_name='高薪员工', index=False)
print(f"\n多个DataFrame已成功写入 '{output_multi_sheet_file}' 的不同工作表")

解释:

常见问题与技巧

1. 处理大文件

对于非常大的Excel文件,一次性加载到内存可能会导致内存溢出。你可以考虑:

chunksize参数:在read_excel()中使用chunksize参数,分块读取数据,逐块处理。

# for chunk in pd.read_excel(file_path, chunksize=1000):
#     # 对每个chunk进行处理
#     print(f"处理了 {len(chunk)} 行数据")

usecols参数:只读取需要的列,减少内存占用。

# df_partial = pd.read_excel(file_path, usecols=['姓名', '工资', '部门'])

2. 日期格式问题

Excel中的日期在Pandas中通常会被正确识别为datetime类型。如果发现日期格式不正确,可以使用pd.to_datetime()进行转换。

# df['入职日期'] = pd.to_datetime(df['入职日期'])

3. 编码问题

在读取CSV等文本文件时,可能会遇到编码问题。Excel文件通常不会有这个问题,但如果出现乱码,可以尝试在read_csv()中使用encoding参数(例如encoding='utf-8'encoding='gbk')。read_excel()通常会自动处理。

4. 性能优化

对于大规模数据操作,可以考虑:

总结与展望

通过本篇博客,你已经掌握了使用Pandas操作Excel的核心技能:从文件的读取、数据的查看,到灵活的选择、深入的清洗、有序的排序、精确的筛选,再到强大的函数应用,最后将处理结果写入新的Excel文件。

Pandas的强大之处远不止于此,它还提供了数据分组聚合(groupby)、数据合并连接(merge/join)、时间序列分析、数据可视化等高级功能。随着你对Pandas的熟练度提高,你将能够解决更复杂的数据处理和分析任务,真正实现办公自动化,大幅提升工作效率。

现在,是时候将这些知识应用到你的实际工作中了! 尝试用Pandas解决你日常工作中遇到的Excel难题,你会发现一个全新的、高效的数据处理世界。祝你在Python自动化办公的道路上越走越远!

以上就是Python自动化办公之使用Pandas玩转Excel数据处理全攻略的详细内容,更多关于Python Pandas处理Excel数据的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文