很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。

下面我来举几个例子。

删除重复行和空行

我们直接用dict.fromkeys的方法把当前的数据转为字典,默认的值为None因为用不到,也就无所谓了。然后我们再用list直接对结果进行类型转换,转换为list。

In [135]:for row in rows4:
print(row)
('name', 'address')
('tom li', 'beijing')
('tom li', 'beijing')
('',)
('mary wang', 'shandong')
('mary wang', 'shandong')
('',)
('de8ug', 'guangzhou')
In [148]:
dict.fromkeys(rows4)
Out[148]:
{('name', 'address'): None,
('tom li', 'beijing'): None,
('',): None,
('mary wang', 'shandong'): None,
('de8ug', 'guangzhou'): None}
In [137]:
list(dict.fromkeys(rows4))
Out[137]:
[('name', 'address'),
('tom li', 'beijing'),
('',),
('mary wang', 'shandong'),
('de8ug', 'guangzhou')]

这时候,重复数据直接去掉了,注意我们这里的dict是python3新版本的,所以顺序没有影响,如果你还在用python2或者python3.5以下,建议升级一下python版本。

接下来,就是空数据的处理了。观察('',)是个元组,第一个位置的数据为空字符串,那么整体长度为1,可以直接通过循环来去掉。

这里的循环我们可以用Python中的语法糖写法,直接一行搞定,最后加个判断只留下长度大于1,最后用list转换为列表。

In [179]:list(x for x in dict.fromkeys(rows4) if len(x[0])>1)Out[179]:[('name', 'address'), ('tom li', 'beijing'), ('mary wang', 'shandong'), ('de8ug', 'guangzhou')]

上面的研究搞定了,直接把研究结果放到函数中解决重复行和空行的问题。

注意这时候我们处理的行数据,所以就不再按列循环了。而且,当前的sheet中处理之后,每一行的内容都会修改位置或删除。所以我们先用old_rows = [x for x in sheet.values]取到旧的每一行的数据,注意这里的sheet后直接用values取到数据,而不是cell对象。这里的old_rows是个列表,就可以用刚才的研究直接转为删除重复和空行的数据了。

接下来,用sheet.delete_rows(1, sheet.max_row)
删除所有行,第一个参数表示从第一行开始,第二个参数为最大行数。最后,用循环新的行数据的方式,把新数据写入当前的sheet。

In [189]:def handle_duplicate(wb, sheetname):"""
去除重复行,空行
先取出每一行,清空sheet,处理后写回
"""
print(f'开始处理工作表:{sheetname}'.center(18, '-'))
sheet = wb[sheetname]
old_rows = [x for x in sheet.values]
print('修改前:', old_rows)
new_rows = list(x for x in dict.fromkeys(old_rows) if len(x[0])>1)
print('修改后-》》', new_rows)# 删除所有行
sheet.delete_rows(1, sheet.max_row)# 写入新数据for row in new_rows:
sheet.append(row)

运行测试,查看结果。再说一次,一定记得测试啊!如果有错误就根据错误提示,查看代码,反复调试,去除bugs。

In [190]:
wb = load_data()
handle_duplicate(wb, '重复行')
save_as(wb)

删除空格

删除空格也需要用到字符串的函数,所以这里还是简单研究一下。如果我们想去除字符串中间的空格,可以用split默认进行分割,然后把分割的结果用’’.join方法连接起来就可以了。

注意join前是空的字符串。这里也用不到strip去除两端的空格了,因为split分割后只有几个最后的字符串组成的列表。

In [192]:
a="a b c "
In [194]:
a.strip()
Out[194]:'a b c'
In [195]:
a.split()
Out[195]:
['a', 'b', 'c']
In [196]:''.join(a.split())
Out[196]:'abc'
In [ ]:

研究成功后,写入函数。这次命名为handle_blank。

In [197]:def handle_blank(wb, sheetname):"""
按列循环, 通过参数确认目标
"""
print(f'开始处理工作表:{sheetname}'.center(18, '-'))
sheet = wb[sheetname]for col in sheet.iter_cols(): # 不加参数,循环所有列for cell in col:
print('修改前:', cell.value, end='')
cell.value = ''.join(cell.value.split())
print('修改后-》》',cell.value)
In [198]:
handle_blank(wb, '空格')

修改日期和时间格式

有时候,我们需要对表格中时间相关的单元格进行格式修改,这里需要用到Python中时间模块datetime,将需要的格式进行拼接后,用strftime进行转换。

假设这里我们想把之前简单的1/11月日格式,更改为年月日的样式,中间加上分隔符/或-,就需要用"%x"或"%Y-%m-%d"来进行操作了。注意这里的%加字母都是官方定义好的格式而已,我们用到时候进行拼接,传给函数就可以了。

具体更多的拼接格式如下:

In [199]:
import datetime
In [209]:
d=datetime.datetime(2019,1,11)
In [203]:
d.strftime("%x")
Out[203]:'01/11/19'
In [205]:
d.strftime("%Y-%m-%d")
Out[205]:'2019-01-11'

研究完成后,我们编写函数。

首先需要用m, d = cell.value.split('/')把之前简单的日期进行分割,得到m,代表月份和日期,然后用datetime进行转换,生成时间相关的对象day,注意里面的参数是数字,所以用int转换,最后把day进行格式化输出。编写函数后,一定记得测试。

In [218]:def handle_time(wb, sheetname):"""
按列循环, 通过参数确认目标
"""
print(f'开始处理工作表:{sheetname}'.center(18, '-'))
sheet = wb[sheetname]for col in sheet.iter_cols(max_col=1, min_row=2): # 找到时间的列, 第一列,从第二行开始for cell in col:
print('修改前:', cell.value, end='')
m, d = cell.value.split('/')
day = datetime.datetime(2019, int(m), int(d))
cell.value = day.strftime("%Y-%m-%d")
print('修改后-》》',cell.value)
In [220]:
wb = load_data()
handle_time(wb, '时间')
save_as(wb)

修复数字和符号

接下来,处理数字和符号相关的操作。加入我们之前的价格,很多是有小数点的,这时候还想保存两位小数,并加上人民币符号为前缀。就需要新的一波研究了。

有小数点,一是要保证位数,我们这里要求2位,二是要对多余的位数四舍五入。可以有以下俩个方式完成,一个用Decimal一个用round,两个的区别是Decimal("0.00")指定位数后,会自动补0,而round遇到0就自动舍掉了。而且round在四舍五入的计算中,还有点特殊。具体可查看官方文档。

我们这里用Decimal来完成函数内相关操作。记得测试啊!

In [227]:from decimal import DecimalIn [240]:a = 3.1b=Decimal(a).quantize(Decimal("0.00"))print(b)3.10In [244]:round(a,2)  # 位数自动省略0Out[244]:3.1In [247]:def handle_num(wb, sheetname):"""    按列循环, 通过参数确认目标    """    print(f'开始处理工作表:{sheetname}'.center(18, '-'))    sheet = wb[sheetname]for col in sheet.iter_cols(min_col=3, max_col=3, min_row=2):  # 找到时间的列, 第一列,从第二行开始for cell in col:            print('修改前:', cell.value, end='')#             cell.value = round(float(cell.value), 3)            cell.value = '¥' + str(Decimal(cell.value).quantize(Decimal("0.00")))            print('修改后-》》',cell.value)In [249]:wb = load_data()handle_num(wb, '数字符号')save_as(wb)

- END -

原文链接:

51CTO博客https://blog.51cto.com/51ctoblog/2438164

文源网络,仅供学习之用,如有侵权,联系删除。

往期精彩

◆  50款开源工具你都用过吗?

◆  python+C、C++混合编程的应用

◆  python网络爬虫的基本原理详解

◆  Python自动操控excel,一小时解决你一天的工作

◆  如何用Python增强Excel,减少处理复杂数据的痛苦?

python 把4个二进制组成float_4个方法用Python自由定制Excel表格相关推荐

  1. python 结果写入excel_python中如何将测试结果写入到原有的excel表格(二)

    今天周五了哦,每个月最开心的就是周五还有发工资那天,呵呵.在这里提前祝大家周末愉快. 上次分享了如何结合python+excel表实现单接口自动化,今天和大家说下,如何将测试结果自动写入到原有的exc ...

  2. python爬虫数据导入excel_Python爬虫练习(3)——将数据导入excel表格

    通过python爬虫抓取下来的数据要怎么存储呢,当然,把数据存储在txt文本中是一个不错的主意,但是,有事为了更加清晰的分析数据,可以将之存储在excel表格中,我之前是先将数据存储在txt文本中,然 ...

  3. python单元测试mock_单元测试-具有多次调用方法的Python Mock对象

    我有一个正在测试的类,该类具有依赖关系的另一个类(该类的实例被传递给CUT的init方法). 我想使用Python Mock库来模拟此类. 我所拥有的是这样的: mockobj = Mock(spec ...

  4. python数组和列表的区别_JS数组方法与python列表方法的比较

    JS的数组(Array)与python的列表(List)很相似,本人因为之前学过JS,后来学习python感觉有些方法很容易混淆,这里对常用的一些方法做些区分 增 删 改 查 排序 逆序 增加元素 1 ...

  5. python音频合成_音频拼接的简单实现方法(python一种,java两种)

    音频拼接,就是5s+5s=10s的这种拼接. 需要修改的地方都是有三处,在代码里标注好了. 一.Python实现: Python3 #!/usr/bin/env python # -*- coding ...

  6. python实现二分查找算法_两种方法实现Python二分查找算法

    一. arr=[1,3,6,9,10,20,30] def findnumber(l,h,number): mid=(l+h)//2 if arr[mid]==number: print(" ...

  7. Python练习猜拳,利用while循环自定义函数,结果数据存入excel表格

    题目: 设计一个猜拳小游戏,系统出一个石头.剪刀或布:用户输入一个石头.剪刀或布:1代表石头,2代表剪刀,3代表布,或输入shitou.石头等均可识别. 游戏玩到用户赢了系统为止,并将结果输入到指定位 ...

  8. python中将npz类型的数据读取出来 并将其存储在excel表格

    1 导包 import xlwings as xw import pandas as pd import numpy as np 2 以国民经济核算季度数据.npz为例子 先上图存储为excel成功后 ...

  9. Python大数据分析与挖掘实战微课版答案 Python大数据分析与挖掘实战课后答案 例题 课后作业 python题目 python题库 数据分析与挖掘题库 数据分析与挖掘项目

    (在此仅展示题目,所有数据.代码.答案.习题等点我头像,在资源中!!!) 以下关于pandas 数据预处理说法正确的是(). A. pandas没有做哑变量的函数 B. 在不导入其他厍的情况下,仅仅使 ...

  10. python查看数据类型的方法_pycharm下查看python的变量类型和变量内容的方法

    pycharm下查看python的变量类型和变量内容的方法 用过Matlab的同学基本都知道,程序里面的变量内容可以很方便的查看到,但python确没这么方便,对于做数据处理的很不方便,其实不是没有这 ...

最新文章

  1. vasp算表面吸附流程_VASP实例分析表面吸附计算
  2. 理解JSON.stringify()高级用法
  3. STM32 基础系列教程 14 - IIC
  4. golang Println、Printf、Sprintf的区别
  5. 状态模式(Strategy Pattern)
  6. Linux性能分析工具汇总
  7. 基本概念学习(8006)--南桥芯片
  8. 74HC138 三八译码器
  9. 谷歌这是要全面退出中国!
  10. matlab fft函数画幅度谱,如何在FFT幅度谱上绘制掩模线
  11. mysql主键和候选键有什么区别?
  12. DFD图练习(图书管理系统)
  13. 无线网密码修改好了无法连接服务器,无线路由器修改密码后电脑无法上网如何解决...
  14. 计算机词汇店名,有创意的店名大全
  15. 成都android培训成都java培训成都3g培训学习资料
  16. JavaScript 基础学习(三)
  17. 一款用autoit3写的小游戏,大家娱乐下
  18. 我想哭,可是欲哭无泪
  19. linux串口设备配置方法(固定ID)
  20. 盈透创始人 Thomas Peterffy

热门文章

  1. 【翻译】Siesta事件记录器入门
  2. PetShop 4.0学习笔记:消息队列MSMQ
  3. redis LRU和LFU
  4. (Maven配置)Failed to read artifact descriptor for xxx:jar解决方法
  5. 一个ExtJs的最基本的mvc模式示例
  6. C 风格字符串,C++string类,MFC,CString类的区别。
  7. Eclipse安装插件支持jQuery智能提示
  8. 推荐几个.NET开源图表组件
  9. c语言 实验6 数组实验报告,实验报告(实验六数组).doc
  10. Linux O(n)调度器