Python pandas对excel的操作实现示例


Posted in Python onJuly 21, 2020

最近经常看到各平台里都有Python的广告,都是对excel的操作,这里明哥收集整理了一下pandas对excel的操作方法和使用过程。本篇介绍 pandas 的 DataFrame 对列 (Column) 的处理方法。示例数据请通过明哥的gitee进行下载。

增加计算列

pandas 的 DataFrame,每一行或每一列都是一个序列 (Series)。比如:

import pandas as pd
df1 = pd.read_excel('./excel-comp-data.xlsx');

此时,用 type(df1['city'],显示该数据列(column)的类型是 pandas.core.series.Series。理解每一列都是 Series 非常重要,因为 pandas 基于 numpy,对数据的计算都是整体计算。深刻理解这个,才能理解后面要说的诸如 apply() 函数等。

如果列名 (column name)没有空格,则列有两种方式表达:

df1['city'] 
df1.city

如果列名有空格,或者创建新列(即该列不存在,需要创建,第一次使用的变量),则只能用第一种表达式。

假设我们要对三个月的数据进行汇总,可以使用下面的方法。实际上就是创建一个新的数据列:

# 由于是创建,不能使用 df.Total
df1['Total'] = df1['Jan'] + df1['Feb'] + df1['Mar']

df1['Jan']df1['Mar'] 都是 Series,所以使用 + 号,可以得到三个 Series 对应位置的数据合计。

Python pandas对excel的操作实现示例

当然,也可以用下面的方式:

df1['total'] = df1.Jan + df1.Feb + df1.Mar

增加条件计算列

假设现在要根据合计数 (Total 列),当 Total 大于 200,000 ,类别为 A,否则为 B。在 Excel 中实现用的是 IF 函数,但在 pandas 中需要用到 numpy 的 where 函数:

df1['category'] = np.where(df1['total'] > 200000, 'A', 'B')

Python pandas对excel的操作实现示例

在指定位置插入列

上面方法增加的列,位置都是放在最后。如果想要在指定位置插入列,要用 dataframe.insert() 方法。假设我们要在 state 列后面插入一列,这一列是 state 的简称 (abbreviation)。在 Excel 中,根据 state 来找到 state 的简称 ,一般用 VLOOKUP 函数。我们用两种方法来实现,第一种方法,简称来自 Python 的 dict。

数据来源:

state_to_code = {"VERMONT": "VT", "GEORGIA": "GA", "IOWA": "IA", "Armed Forces Pacific": "AP", "GUAM": "GU",
         "KANSAS": "KS", "FLORIDA": "FL", "AMERICAN SAMOA": "AS", "NORTH CAROLINA": "NC", "HAWAII": "HI",
         "NEW YORK": "NY", "CALIFORNIA": "CA", "ALABAMA": "AL", "IDAHO": "ID", "FEDERATED STATES OF MICRONESIA": "FM",
         "Armed Forces Americas": "AA", "DELAWARE": "DE", "ALASKA": "AK", "ILLINOIS": "IL",
         "Armed Forces Africa": "AE", "SOUTH DAKOTA": "SD", "CONNECTICUT": "CT", "MONTANA": "MT", "MASSACHUSETTS": "MA",
         "PUERTO RICO": "PR", "Armed Forces Canada": "AE", "NEW HAMPSHIRE": "NH", "MARYLAND": "MD", "NEW MEXICO": "NM",
         "MISSISSIPPI": "MS", "TENNESSEE": "TN", "PALAU": "PW", "COLORADO": "CO", "Armed Forces Middle East": "AE",
         "NEW JERSEY": "NJ", "UTAH": "UT", "MICHIGAN": "MI", "WEST VIRGINIA": "WV", "WASHINGTON": "WA",
         "MINNESOTA": "MN", "OREGON": "OR", "VIRGINIA": "VA", "VIRGIN ISLANDS": "VI", "MARSHALL ISLANDS": "MH",
         "WYOMING": "WY", "OHIO": "OH", "SOUTH CAROLINA": "SC", "INDIANA": "IN", "NEVADA": "NV", "LOUISIANA": "LA",
         "NORTHERN MARIANA ISLANDS": "MP", "NEBRASKA": "NE", "ARIZONA": "AZ", "WISCONSIN": "WI", "NORTH DAKOTA": "ND",
         "Armed Forces Europe": "AE", "PENNSYLVANIA": "PA", "OKLAHOMA": "OK", "KENTUCKY": "KY", "RHODE ISLAND": "RI",
         "DISTRICT OF COLUMBIA": "DC", "ARKANSAS": "AR", "MISSOURI": "MO", "TEXAS": "TX", "MAINE": "ME"}

如果我们想根据 dict 的 key 找到对应的值,可以使用 dict.get() 方法,这个方法在找不到 key 的时候,不会抛出异常,只是返回 None。比如

state_to_code.get('TEXAS') # 返回 TX
state_to_code.get('TEXASS') # 返回 None

dict.get() 方法参数为 key,是一个标量值。我们并不能像下面这样把整列都传给这个方法,比如下面这样:

df1['abbrev'] = state_to_code.get(df1['state'])

所以我们需要先构造一个 Series (abbrev),然后把 abbrev 赋值给 df1['abbrev']

abbrev = df1['state'].apply(lambda x: state_to_code.get(x.upper()))
df1['abbrev'] = abbrev    # 在后面插入列
df1.insert(6, 'abbr', abbrev) # 在指定位置插入列

apply() 函数值得专门写一篇,暂且不细说。

Python pandas对excel的操作实现示例

Vlookup 函数功能实现

实现类似 Excel 的 VLookup 功能,可以用 dataframe.merge() 方法。为此,需要将 state_to_code 这个 dict 的数据加载到 DataFrame 中。这里提供两种方法。

方法1: 把数据放在 excel 工作表中,然后读取 Excel 文件加载。数据如下:

Python pandas对excel的操作实现示例

excel_file = pd.ExcelFile('excel-comp-data.xlsx')
df_abbrev = pd.read_excel(excel_file, sheetname = 'abbrev')
df2 = df1.merge(df_abbrev, on='state') # 类似数据库的 inner join,不匹配数据不会显示

VLookup 函数根据位置来匹配,merge() 方法根据列名来匹配。因为上面语句中没有指定连接类型,不匹配的记录不会显示。如果需要将 df1 的数据全部显示出来,需要指定 merge() 方法的 how 参数:

df3 = df1.merge(df_abbrev, on='state', how='left') # 类似数据库的 left join

Python pandas对excel的操作实现示例

方法2:直接将 state_to_code 加载到 DataFrame。但因为 state_to_code 全部是标量值 (scalar values),方法有一点不同,如下:

# 将 state_to_code 直接加载到 DataFrame
abbr2 = pd.DataFrame(list(state_to_code.items()), columns=['state', 'abbr'])

计算合计数

假如需要对各个月份以及月份合计数进行求和。pandas 可以对 Series 运行 sum() 方法来计算合计:

import pandas as pd
import numpy as np

df = pd.read_excel('./excel-comp-data.xlsx');
df['Total'] = df.Jan + df.Feb + df.Mar

# sum_row 的类型是 pandas.core.series.Series, Jan, Feb 等成为 Series 的 index
sum_row = df[['Jan', 'Feb', 'Mar', 'Total']].sum()

Python pandas对excel的操作实现示例

也可以将 sum_row 转换成 DataFrame, 以列的方式查看。DataFrameT 方法实现行列互换。

# 转置变成 DataFrame
df_sum = pd.DataFrame(data=sum_row).T
df_sum

Python pandas对excel的操作实现示例

如果想要把合计数放在数据的下方,则要稍作加工。首先通过 reindex() 函数将 df_sum 变成与 df 具有相同的列,然后再通过 append() 方法,将合计行放在数据的后面:

# 转置变成 DataFrame
df_sum = pd.DataFrame(data=sum_row).T

# 将 df_sum 添加到 df
df_sum = df_sum.reindex(columns=df.columns)

# append 创建一个新的 DataFrame
df_with_total = df.append(df_sum, ignore_index=True)

Python pandas对excel的操作实现示例

分类汇总

Excel 的分类汇总功能,在数据功能区,但因为分类汇总需要对数据进行排序,并且分类汇总的数据与明细数据混在一起,个人很少用到,分类汇总一般使用数据透视表。

Python pandas对excel的操作实现示例

而在 pandas 进行分类汇总,可以使用 DataFramegroupby() 函数,然后再对 groupby() 生成的 pandas.core.groupby.DataFrameGroupBy 对象进行求和:

df_groupby = df[['state','Jan', 'Feb','Mar', 'Total']].groupby('state').sum()
df_groupby.head()

Python pandas对excel的操作实现示例

数据格式化

pandas 默认的数据显示,没有使用千分位分隔符,在数据较大时,感觉不方便。如果需要对数据的显示格式化,可以自定义一个函数 number_format(),然后对 DataFrame 运行 applymap(number_format) 函数。applymap() 函数对 DataFrame 中每一个元素都运行 number_format 函数。number_format 函数接受的参数必须为标量值,返回的也是标量值。

# 数字格式化
def number_format(x):
  return "{:,.0f}".format(x) # 使用逗号分隔,没有小数位

formated_df = df_groupby.applymap(number_format)
formated_df.head()

Python pandas对excel的操作实现示例

数据透视表

pandas 运行数据透视表,使用 pivot_table() 方法。熟练使用 pivot_table() 需要一些练习。这里只是介绍最基本的功能:

  • index 参数: 按什么条件进行汇总
  • values 参数:对哪些数据进行计算
  • aggfunc 参数:aggregation function,执行什么运算
# pivot table
# pd.pivot_table 生成一个新的 DataFrame
df_pivot = pd.pivot_table(df, index=['state'], values=['Jan','Feb','Mar','Total'], aggfunc= np.sum)

总结

Pandas可以对Excel进行基础的读写操作

Pandas可以实现对Excel各表各行各列的增删改查

Pandas可以进行表中列行筛选等

到此这篇关于Python pandas对excel的操作实现示例的文章就介绍到这了,更多相关Python pandas对excel操作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现批量下载文件
May 17 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
python实现批量修改文件名代码
Sep 10 Python
python+pillow绘制矩阵盖尔圆简单实例
Jan 16 Python
Python3中bytes类型转换为str类型
Sep 27 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 Python
浅谈Python爬虫原理与数据抓取
Jul 21 #Python
用于ETL的Python数据转换工具详解
Jul 21 #Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 #Python
Python json格式化打印实现过程解析
Jul 21 #Python
基于python实现删除指定文件类型
Jul 21 #Python
python打开音乐文件的实例方法
Jul 21 #Python
Python读取yaml文件的详细教程
Jul 21 #Python
You might like
phpBB BBcode处理的漏洞
2006/10/09 PHP
珊瑚虫IP库浅析
2007/02/15 PHP
php mssql 时间格式问题
2009/01/13 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
Smarty模板语法详解
2019/07/20 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
js动态设置div的值下例子
2013/10/29 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
javascript几个易错点记录
2014/11/26 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
小学运动会表扬稿
2014/01/19 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
关爱残疾人标语
2014/06/25 职场文书
课外访万家心得体会
2014/09/03 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
会议主持词结束语
2015/07/03 职场文书
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android