python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...
前情提要:蓬佩奥不怕开水烫:XLOOKUP函数简单使用指南
之前这篇文章里面,是使用的word对报表进行处理,相对简单快捷;但是,数据量比较大比较复杂的情况下,用word处理起来会有点吃力。
因此,我钻研了一个下午,写了个python脚本,中间还遇到不少问题,不过还是写出来了,以后再处理类似的报表的时候,就不用再打开word了。
原始Excel有很多问题:股票代码不是标准的六位数字;万亿不分,没有单位;有多余的数据行。
这里使用Python 3 的Pandas库进行整理,主要使用pandas库基本操作。
#读取准备好的财务报表
import pandas as pd
import re
input_file = r"电子信息行业利润表.xlsx"
df = pd.read_excel(input_file)df=df.drop(['序号','相关','公告日期'],axis=1) #删除不需要的列
然后用format补全六位代码,在这里居然也卡了很久,最后发现错误原因竟然是没有重新赋值!!
在学习python的过程中,遇到的最大的困难是什么?
#六位股票代码补全
def six_digits(stock_num):stock_num=str("{0:06d}".format(stock_num))return(stock_num)df['股票代码']=df['股票代码'].apply(lambda x:six_digits(x))
把列名称规范一下。其实这一步我也不是太清楚怎么给每一列批量重命名,有知道的可以告诉我。
#列标题重命名
df=df.rename(columns={'净利润':'净利润(亿元)','净利润同比':'净利润同比(%)','营业总收入':'营业总收入(亿元)','营业总收入同比':'营业总收入同比(%)','营业支出':'营业支出(亿元)','销售费用':'销售费用(亿元)','管理费用':'管理费用(亿元)','财务费用':'财务费用(亿元)','营业总支出':'营业总支出(亿元)','营业利润':'营业利润(亿元)', '利润总额':'利润总额(亿元)'})
然后规范一下单位。这里需要用到正则表达式了。
两个正则表达式,分别匹配所有“万”“亿”为单位的金额;
#引入正则表达式,去除万亿等单位
wan_pattern = re.compile('(?P<amount>(-|)d{1,4}[万])')
yi_pattern = re.compile('(?P<amount>(-|)d*.*d*[亿])')
转换为亿元
def amt_process(amt):str1=str(amt)if wan_pattern.search(str1):new_amt=float(str1.rstrip("万"))/10000 #去掉“万”结尾并除以10000return('{:.3f}'.format(new_amt)) #保留三位小数elif yi_pattern.search(str1):new_amt=float(str1.rstrip("亿")) #直接去掉“亿”结尾return('{:.2f}'.format(new_amt)) #保留两位小数else:return(amt)df=df.applymap(amt_process) #对DataFrame所有元素应用数值处理函数
输出一下DataFrame,看上去好像没什么不对:
但是输出Excel以后,出现了问题
df.to_excel(r"电子信息行业利润表(已整理).xlsx",sheet_name="利润表",index=False)
正则表达式处理之后,输出的全部为文本型数值。
问题出在哪里呢?我们发现,出错的列,数据类型都不是我们需要的float64
看到了这两篇文章:
乘风:Pandas数据类型转换的几个小技巧
Pandas DataFrame将多列数据一次性从object转换为datetime
决定试试
amount=[]
for x in df.columns.tolist():if "(亿元)" in x:amount.append(x)df[amount]=df[amount].apply(pd.to_numeric)
最后输出
欢迎各位批评指正。
python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...相关推荐
- Python的DataFrame中筛选满足某列的值在指定数值内的行
Python的DataFrame中筛选满足某列的值在指定数值内的行 以dataframe对象df1为例,选取所有满足A列的值在[1,2,3,4]的行. 语法为df1[ df1['A'].isin([1 ...
- python pandas dataframe 行列选择,切片操作 原创 2017年02月15日 21:43:18 标签: python 30760 python pandas dataframe
python pandas dataframe 行列选择,切片操作 原创 2017年02月15日 21:43:18 标签: python / 30760 编辑 删除 python pandas dat ...
- Python向DataFrame中指定位置添加一列或多列
对于这个问题,相信很多人都会很困惑,本篇文章将会给大家介绍一种非常简单的方式向DataFrame中任意指定的位置添加一列. 在此之前或许有不少读者已经了解了最普通的添加一列的方式,如下: import ...
- python explode_pandas dataframe 中的explode函数用法详解
在使用 pandas 进行数据分析的过程中,我们常常会遇到将一行数据展开成多行的需求,多么希望能有一个类似于 hive sql 中的 explode 函数. 这个函数如下: Code # !/usr/ ...
- 《Python自然语言处理(第二版)-Steven Bird等》学习笔记:第01章 语言处理与Python
第01章 语言处理与Python 1.1 语言计算:文本和单词 Python入门 NLTK 入门 搜索文本 计数词汇 1.2 近观Python:将文本当做词链表 链表(list,也叫列表) 索引列表 ...
- python遍历dataframe中的每个字符_pandas中遍历dataframe的每一个元素的实现
假如有一个需求场景需要遍历一个csv或excel中的每一个元素,判断这个元素是否含有某个关键字 那么可以用python的pandas库来实现. 方法一: pandas的dataframe有一个很好用的 ...
- python从DataFrame中删除列
目录 在操作数据的时候, DataFrame 对象中删除一个或多个列是常见的操作,并且实现方法较多,然而这中间有很多细节值得关注. 首先,一般被认为是"正确"的方法,是使用 Dat ...
- python dataframe列数值相加,python合并dataframe中的行并将值相加
我想这会有帮助.这段代码可以处理任意数量的连续"T",甚至可以更改要组合的字符.我在代码中添加了注释来解释它的作用.在import pandas as pd def combine ...
- 【Python】Python3中的str和bytes
参考文章:Python 3的bytes/str之别 len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数 >>> len('ABC') 3 >& ...
最新文章
- R计算混淆矩阵(Confusion Matrix)
- 模仿人脑视觉处理,助力神经网络应对对抗性样本
- 通过iTextSharp为PDF添加带有超链接的Bookmark
- 【MFC】MFC应用程序框架详解
- 我的Java自定义线程池执行器
- validation 参数校验和统一异常处理
- Adobe illustrator 批量变换同时选中的单个对象 - 连载 12
- php 字符串中文截取,PHP 截取中文字符串(支持多种编码)
- ucos实时操作系统应用开发流程
- Mac OS 文件、文件夹重命名的方法
- SQL Server 2016 开发版安装
- iredmail mysql_centos 7搭建邮件服务器iRedMail
- 什么是Instagram直播购物?如何设置Instagram 直播购物?
- 秀一波酷炫可视化大屏!
- 【工业智能】用AI来做工业设备的故障诊断,目前还停留在“鸡尾酒疗法”阶段
- Tomcat : 修改Tomcat端口号
- java 日期相差月数_Java 计算两个日期之间相差的月数
- 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
- 文件夹.EXE病毒清理
- 迅捷转换器转换效果鉴赏