用Python的pandas框架操作Excel文件中的数据教程


Posted in Python onMarch 31, 2015

引言

本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务。有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其他地方找到的复杂功能同等重要。作为额外的福利,我将会进行一些模糊字符串匹配,以此来展示一些小花样,以及展示pandas是如何利用完整的Python模块系统去做一些在Python中是简单,但在Excel中却很复杂的事情的。

有道理吧?让我们开始吧。
为某行添加求和项

我要介绍的第一项任务是把某几列相加然后添加一个总和栏。

首先我们将excel 数据 导入到pandas数据框架中。
 

import pandas as pd
import numpy as np
df = pd.read_excel("excel-comp-data.xlsx")
df.head()

用Python的pandas框架操作Excel文件中的数据教程

我们想要添加一个总和栏来显示Jan、Feb和Mar三个月的销售总额。

在Excel和pandas中这都是简单直接的。对于Excel,我在J列中添加了公式sum(G2:I2)。在Excel中看上去是这样的:

用Python的pandas框架操作Excel文件中的数据教程

下面,我们是这样在pandas中操作的:
 

df["total"] = df["Jan"] + df["Feb"] + df["Mar"]
df.head()

用Python的pandas框架操作Excel文件中的数据教程

接下来,让我们对各列计算一些汇总信息以及其他值。如下Excel表所示,我们要做这些工作:

用Python的pandas框架操作Excel文件中的数据教程

如你所见,我们在表示月份的列的第17行添加了SUM(G2:G16),来取得每月的总和。
进行在pandas中进行列级别的分析很简单。下面是一些例子:
 

df["Jan"].sum(), df["Jan"].mean(),df["Jan"].min(),df["Jan"].max()
 
(1462000, 97466.666666666672, 10000, 162000)

现在我们要把每月的总和相加得到它们的和。这里pandas和Excel有点不同。在Excel的单元格里把每个月的总和相加很简单。由于pandas需要维护整个DataFrame的完整性,所以需要一些额外的步骤。

首先,建立所有列的总和栏
 

sum_row=df[["Jan","Feb","Mar","total"]].sum()
sum_row
 
Jan   1462000
Feb   1507000
Mar    717000
total  3686000
dtype: int64

这很符合直觉,不过如果你希望将总和值显示为表格中的单独一行,你还需要做一些微调。

我们需要把数据进行变换,把这一系列数字转换为DataFrame,这样才能更加容易的把它合并进已经存在的数据中。T 函数可以让我们把按行排列的数据变换为按列排列。
 

df_sum=pd.DataFrame(data=sum_row).T
df_sum

用Python的pandas框架操作Excel文件中的数据教程

在计算总和之前我们要做的最后一件事情是添加丢失的列。我们使用reindex来帮助我们完成。技巧是添加全部的列然后让pandas去添加所有缺失的数据。
 

df_sum=df_sum.reindex(columns=df.columns)
df_sum

用Python的pandas框架操作Excel文件中的数据教程

现在我们已经有了一个格式良好的DataFrame,我们可以使用append来把它加入到已有的内容中。
 

df_final=df.append(df_sum,ignore_index=True)
df_final.tail()

用Python的pandas框架操作Excel文件中的数据教程

额外的数据变换

另外一个例子,让我们尝试给数据集添加状态的缩写。

对于Excel,最简单的方式是添加一个新的列,对州名使用vlookup函数并填充缩写栏。

我进行了这样的操作,下面是其结果的截图:

用Python的pandas框架操作Excel文件中的数据教程

你可以注意到,在进行了vlookup后,有一些数值并没有被正确的取得。这是因为我们拼错了一些州的名字。在Excel中处理这一问题是一个巨大的挑战(对于大型数据集而言)

幸运的是,使用pandas我们可以利用强大的python生态系统。考虑如何解决这类麻烦的数据问题,我考虑进行一些模糊文本匹配来决定正确的值。

幸运的是其他人已经做了很多这方面的工作。fuzzy wuzzy库包含一些非常有用的函数来解决这类问题。首先要确保你安装了他。

我们需要的另外一段代码是州名与其缩写的映射表。而不是亲自去输入它们,谷歌一下你就能找到这段代码code。

首先导入合适的fuzzywuzzy函数并且定义我们的州名映射表。
 

from fuzzywuzzy import fuzz
from fuzzywuzzy import process
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"}

这里有些介绍模糊文本匹配函数如何工作的例子。
 

process.extractOne("Minnesotta",choices=state_to_code.keys())
 
('MINNESOTA', 95)
 
process.extractOne("AlaBAMMazzz",choices=state_to_code.keys(),score_cutoff=80)

现在我知道它是如何工作的了,我们创建自己的函数来接受州名这一列的数据然后把他转换为一个有效的缩写。这里我们使用score_cutoff的值为80。你可以做一些调整,看看哪个值对你的数据来说比较好。你会注意到,返回值要么是一个有效的缩写,要么是一个np.nan 所以域中会有一些有效的值。
 

def convert_state(row):
  abbrev = process.extractOne(row["state"],choices=state_to_code.keys(),score_cutoff=80)
  if abbrev:
    return state_to_code[abbrev[0]]
  return np.nan

把这列添加到我们想要填充的单元格,然后用NaN填充它
 

df_final.insert(6, "abbrev", np.nan)
df_final.head()

用Python的pandas框架操作Excel文件中的数据教程

我们使用apply 来把缩写添加到合适的列中。
 

df_final['abbrev'] = df_final.apply(convert_state, axis=1)
df_final.tail()

用Python的pandas框架操作Excel文件中的数据教程

我觉的这很酷。我们已经开发出了一个非常简单的流程来智能的清理数据。显然,当你只有15行左右数据的时候这没什么了不起的。但是如果是15000行呢?在Excel中你就必须进行一些人工清理了。
分类汇总

在本文的最后一节中,让我们按州来做一些分类汇总(subtotal)。

在Excel中,我们会用subtotal 工具来完成。

用Python的pandas框架操作Excel文件中的数据教程

输出如下:

用Python的pandas框架操作Excel文件中的数据教程

在pandas中创建分类汇总,是使用groupby 来完成的。
 

df_sub=df_final[["abbrev","Jan","Feb","Mar","total"]].groupby('abbrev').sum()
df_sub

用Python的pandas框架操作Excel文件中的数据教程

然后,我们想要通过对data frame中所有的值使用 applymap 来把数据单位格式化为货币。
 

def money(x):
  return "${:,.0f}".format(x)
 
formatted_df = df_sub.applymap(money)
formatted_df

用Python的pandas框架操作Excel文件中的数据教程

格式化看上去进行的很顺利,现在我们可以像之前那样获取总和了。
 

sum_row=df_sub[["Jan","Feb","Mar","total"]].sum()
sum_row

 

Jan   1462000
Feb   1507000
Mar    717000
total  3686000
dtype: int64

把值变换为列然后进行格式化。
 

df_sub_sum=pd.DataFrame(data=sum_row).T
df_sub_sum=df_sub_sum.applymap(money)
df_sub_sum

用Python的pandas框架操作Excel文件中的数据教程

最后,把总和添加到DataFrame中。
 

final_table = formatted_df.append(df_sub_sum)
final_table

用Python的pandas框架操作Excel文件中的数据教程

你可以注意到总和行的索引号是‘0'。我们想要使用rename 来重命名它。
 

final_table = final_table.rename(index={0:"Total"})
final_table

用Python的pandas框架操作Excel文件中的数据教程

结论

到目前为止,大部分人都已经知道使用pandas可以对数据做很多复杂的操作——就如同Excel一样。因为我一直在学习pandas,但我发现我还是会尝试记忆我是如何在Excel中完成这些操作的而不是在pandas中。我意识到把它俩作对比似乎不是很公平——它们是完全不同的工具。但是,我希望能接触到哪些了解Excel并且想要学习一些可以满足分析他们数据需求的其他替代工具的那些人。我希望这些例子可以帮助到其他人,让他们有信心认为他们可以使用pandas来替换他们零碎复杂的Excel,进行数据操作。

Python 相关文章推荐
Python中使用HTMLParser解析html实例
Feb 08 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
Python实现的科学计算器功能示例
Aug 04 Python
python 自定义异常和异常捕捉的方法
Oct 18 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
python Web flask 视图内容和模板实现代码
Aug 23 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
Python高并发解决方案实现过程详解
Jul 31 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
详解python对象之间的交互
Sep 29 Python
Python Pandas知识点之缺失值处理详解
May 11 Python
Python实现国外赌场热门游戏Craps(双骰子)
Mar 31 #Python
通过代码实例展示Python中列表生成式的用法
Mar 31 #Python
使用Python实现一个简单的项目监控
Mar 31 #Python
详解Python中内置的NotImplemented类型的用法
Mar 31 #Python
python计算N天之后日期的方法
Mar 31 #Python
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 #Python
python根据出生日期获得年龄的方法
Mar 31 #Python
You might like
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
php随机输出名人名言的代码
2012/10/07 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
PHP微信支付实例解析
2016/07/22 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
新手简单了解vue
2019/05/29 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
详解Python核心对象类型字符串
2018/02/11 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
大学生两会学习心得体会
2014/03/10 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
合伙经营协议书范本
2014/04/18 职场文书
施工安全生产承诺书
2014/05/23 职场文书
条幅标语大全
2014/06/20 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
会计师事务所实习证明
2014/11/16 职场文书
法院个人总结
2015/03/03 职场文书
爱心募捐通知范文
2015/04/27 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书