python读取xlsx文件pandas_用Python的pandas框架操作Excel文件中的数据教程

引言

本文的目的,是向您展示如何使用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()

2015331165924361.jpg?2015231165944

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

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

2015331165956781.jpg?201523117017

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

df["total"] = df["Jan"] + df["Feb"] + df["Mar"]

df.head()

2015331170032225.jpg?201523117048

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

2015331170102927.jpg?201523117117

如你所见,我们在表示月份的列的第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

2015331170139513.jpg?201523117157

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

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

df_sum

2015331170219215.jpg?201523117233

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

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

df_final.tail()

2015331170246729.jpg?20152311735

额外的数据变换

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

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

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

2015331170316938.jpg?201523117337

你可以注意到,在进行了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()

2015331170756214.jpg?201523117821

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

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

df_final.tail()

2015331170841803.jpg?201523117936

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

分类汇总

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

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

2015331171026151.jpg?2015231171048

输出如下:

2015331171058325.jpg?2015231171121

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

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

df_sub

2015331171140032.jpg?201523117128

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

def money(x):

return "${:,.0f}".format(x)

formatted_df = df_sub.applymap(money)

formatted_df

2015331171220031.jpg?2015231171241

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

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

2015331171257647.jpg?2015231171318

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

final_table = formatted_df.append(df_sub_sum)

final_table

2015331171338217.jpg?201523117142

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

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

final_table

2015331171422425.jpg?2015231171439

结论

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

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

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

相关文章

delphi 生成 超大量xml_用OpenCV4实现图像的超分别率

用OpenCV4实现图像的超分别率本实验原文链接: f"https://arxiv.org/pdf/1807.06779.pdf">https://arxiv.org/pdf/1807.06779.pdf原文摘要单图像超分辨率(SISR)的主要挑战是如何恢复微小纹理等高频细节。然而,大多数最…

dubbo全局异常处理_基于spring aop的dubbo异常统一处理

dubbo统一异常处理,调用方只显示封装后的异常。1、返回封装后的Exception2、返回封装后的统一返回信息import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Aspect;import org.slf4j.Logger;import org.slf4j.LoggerFactory;impo…

python123平台作业答案第十一周_马哥2016全新Linux+Python高端运维班第十次作业

系统的INPUT和OUTPUT默认策略为DROP,请完成以下关于iptables的题目;iptables -A INPUT -d 10.18.11.13 -p tcp --dport 22 -j ACCEPT #允许ssh端口 iptables -A OUTPUT -s 10.18.11.13 -p tcp --sport 22 -j ACCEPT iptables -P OUTPUT DROP #设置OUTPUT…

义教志愿服务系统c语言,[志愿服务]以己为师 东科学子义教传爱心

为积极响应国家教育计划,丰富孩子们的暑期生活,进一步落实“春泥”课堂先进义教理念,7月12日,浙江海洋大学东海科学技术学院大学生“海岛征程十五载,红色基因永传承”赴蚂蚁岛实践团23名队员走进蚂蚁岛文化礼堂&#x…

主动断开socket链接_TCP连接与断开详解(socket通信)

http://blog.csdn.net/Ctrl_qun/article/details/52518479一、TCP数据报结构以及三次握手TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。…

大整数算术求值 c语言 栈,用C语言实现 多位整数的四则运算,用栈,例如56*(12+20)-102/2...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼gets(szExpression);// 中缀表达式转后缀表达式&#xff0c;结果保存在expression中for (int i 0; i < strlen(szExpression); i){if (isspace(szExpression[i])) // 空白字符{if (bFindBegin){expression[num].type 1;expres…

java可视化压缩_WEB可视化技术发展

EverCraft一直在关注Web可视化技术的发展&#xff0c;本文对国外一篇感觉很不错的综述性文章进行翻译&#xff0c;供这一领域的爱好者相互学习。这篇paper的信息为&#xff1a;“Mwalongo, F., et al., State-of-the-Art Report in Web-based Visualization. COMPUTER GRAPHICS…

thumbdata4删除后果_安卓手机上巨大的.thumbdata4图片预读缓存清理方法

以下是目前找到比较有效的帮 .thumbdata4-文件瘦身的好方法.下面的一大堆废话的核心就是进手机设置>应用程序>显示系统程序>媒体存储器>存储>清除数据/缓存.重启后会发现thumbdata还会出现但是没有数GB那么大了.How do I Reset the AndroidMedia Scan Database?…

android自定义alertdialog不现实输入法,自定义的dialog中的EditText无法弹出输入法解决方案...

1.解决无法弹出输入法&#xff1a;在show()方法调用之前&#xff0c;用dialog.setView(new EditText(context))添加一个空的EditText&#xff0c;由于是自定义的AlertDialog&#xff0c;有我们指定的布局&#xff0c;所以设置这个不会影响我们的功能&#xff0c;这样就可以弹出…

python爬取微博内容_请问该如何通过python调用新浪微博的API来爬取数据?

1&#xff1a;安装python(这个不多说啦) 2&#xff1a;下载新浪微博SDK的python包&#xff0c;解压为weibopy目录 3&#xff1a;申请AppKey&#xff0c; 流程&#xff1a; 1&#xff1a;通过oAuth认证 按我的理解简化如下&#xff1a; 用户在新浪微博给的页面输入账号密码&…

android 保活方案_Android 后台保活手段总结 (上篇)

Android 后台保活手段总结 (上篇)由于众所周知的限制&#xff0c;在国内无法使用GCM推送服务&#xff0c;想要自己搭建推送服务的话&#xff0c;有两个绕不开的技术点&#xff0c;一个是TCP长连的保活&#xff0c;另一个就是后台进程的保活。虽然看起来是老生常谈的问题&#x…

linux修改栈指针x86,为什么x86-64 Linux系统调用会修改RCX,这个值意味着什么?

我正在尝试使用sys_brk syscall在linux中分配一些内存.这是我尝试过的&#xff1a;BYTES_TO_ALLOCATE equ 0x08section .textglobal _start_start:mov rax, 12mov rdi, BYTES_TO_ALLOCATEsyscallmov rax, 60syscall根据linux调用约定,我希望返回值在rax寄存器中(指向已分配内存…

wordpress phpmyadmin_西部数码使用指南:虚拟主机WordPress部署SSL注意事项

版权归西部数码所有&#xff0c;原文链接&#xff1a;https://www.west.cn/faq/list.asp?unid2068注意事项&#xff1a;1.如果您的主题/插件使用绝对地址调用了http请求可能会导致网站打开会乱码&#xff0c;或不能有绿锁标识&#xff0c;需要联系程序提供商将所有http请求修改…

android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS

我是.NET开发人员,因此代码在C#中.但是你应该能够轻松翻译以下内容.iText是一个PDF优先的库,[X] HTML解析非常复杂,因此在这方面并不完整.每当解析[X] HTML并且事情不按预期的方式进行特定标记时,您应遵循的基本步骤是&#xff1a;>验证XML Worker支持标记&#xff1a;Tags …

python 小说爬虫_从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载

从零开始写Python爬虫 --- 1.7 爬虫实践&#xff1a; 排行榜小说批量下载Ehco 5 个月前 本来只是准备做一个爬起点小说名字的爬虫&#xff0c;后来想了一下&#xff0c;为啥不顺便把小说的内容也爬下来呢&#xff1f;于是我就写了这个爬虫&#xff0c;他爬下了各类小说排行榜上…

java 某个字符在字符串中出现的所有位置_Java面试常考核心概念

这篇文章专注于Java基础知识&#xff0c;不涉及List、Map、多线程、锁相关的内容&#xff0c;需要的可以查看我的其他博客hofes blog​hhf443.github.ioJDK&JRE&JVMJDK&#xff08;Java Development Kit&#xff09;是针对 Java 开发员的产品&#xff0c;是整个 Java 的…

lan交换和无线教师手册_简单几步,无线路由器变交换机

当原来的路由器lan口不够用&#xff0c;可以加一个交换机扩展lan口数量&#xff0c;如果需要增加的lan口数量不超过3个可以考虑找台不用的无线路由器当交换机用。另外&#xff0c;随着交换机更新家中都有旧无线路由器闲置&#xff0c;完全可以再次利用。下面看一下&#xff0c;…

Linux fast open,Linux内核3.7 TCP Fast Open验证实例

Linux内核在3.6和3.7合入了TCP Fast Open特性&#xff0c;在3.7.3版本上验证了一下&#xff0c;I did it!以下是C语言实例()&#xff1a;server端代码&#xff1a;#include /* See NOTES */#include#include#includeint main(){int portno 5060;socklen_t clilen;char buffer[…

vue 怎么全局到入常量_Vue 中如何定义全局的变量和常量(转)

17.6k 次阅读 读完需要 10 分钟7Vue 中如何定义全局的变量和常量我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入.尝试1:创建 global.js 并且在其中定义let a 10;在入口文件中引入 global.jsimport ./global.js在项目中使用:a// 报错发…

revit找不到附加模块程序集_TensorFlow基础知识——常用模块(一)

1本节简述对于开展深度学习开发的目标而言&#xff0c;我们需要掌握的除了必要的深度学习理论基础、必要的开发依赖库基础知识、基本的开发套路之外&#xff0c;我们还需要掌握它常见的外围小帮手都有哪些。这些小帮手就是深度学习依赖库中的其他并不是核心的模块&#xff0c;但…