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中的对象拷贝示例 python引用传递
Jan 23 Python
python根据距离和时长计算配速示例
Feb 16 Python
python的keyword模块用法实例分析
Jun 30 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
python timestamp和datetime之间转换详解
Dec 11 Python
Python中常见的异常总结
Feb 20 Python
Python装饰器基础概念与用法详解
Dec 22 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
python gdal安装与简单使用
Aug 01 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
Anaconda和ipython环境适配的实现
Apr 22 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
用php写的serv-u的web申请账号的程序
2006/10/09 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
Python入门篇之字符串
2014/10/17 Python
Python多线程编程(一):threading模块综述
2015/04/05 Python
python实现网页自动签到功能
2019/01/21 Python
python实现猜数字游戏
2020/03/25 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
单位授权委托书范本
2014/09/26 职场文书
社会工作专业自荐信
2014/09/26 职场文书
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers