python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...
前情提要:蓬佩奧不怕開水燙:XLOOKUP函數(shù)簡單使用指南
之前這篇文章里面,是使用的word對報表進(jìn)行處理,相對簡單快捷;但是,數(shù)據(jù)量比較大比較復(fù)雜的情況下,用word處理起來會有點吃力。
因此,我鉆研了一個下午,寫了個python腳本,中間還遇到不少問題,不過還是寫出來了,以后再處理類似的報表的時候,就不用再打開word了。
信息來源:東方財富Choice數(shù)據(jù)-2019年電子信息行業(yè)財務(wù)報表-利潤表原始Excel有很多問題:股票代碼不是標(biāo)準(zhǔn)的六位數(shù)字;萬億不分,沒有單位;有多余的數(shù)據(jù)行。
這里使用Python 3 的Pandas庫進(jìn)行整理,主要使用pandas庫基本操作。
#讀取準(zhǔn)備好的財務(wù)報表 import pandas as pd import re input_file = r"電子信息行業(yè)利潤表.xlsx" df = pd.read_excel(input_file)df=df.drop(['序號','相關(guān)','公告日期'],axis=1) #刪除不需要的列然后用format補(bǔ)全六位代碼,在這里居然也卡了很久,最后發(fā)現(xiàn)錯誤原因竟然是沒有重新賦值!!
在學(xué)習(xí)python的過程中,遇到的最大的困難是什么?
#六位股票代碼補(bǔ)全 def six_digits(stock_num):stock_num=str("{0:06d}".format(stock_num))return(stock_num)df['股票代碼']=df['股票代碼'].apply(lambda x:six_digits(x))把列名稱規(guī)范一下。其實這一步我也不是太清楚怎么給每一列批量重命名,有知道的可以告訴我。
#列標(biāo)題重命名 df=df.rename(columns={'凈利潤':'凈利潤(億元)','凈利潤同比':'凈利潤同比(%)','營業(yè)總收入':'營業(yè)總收入(億元)','營業(yè)總收入同比':'營業(yè)總收入同比(%)','營業(yè)支出':'營業(yè)支出(億元)','銷售費(fèi)用':'銷售費(fèi)用(億元)','管理費(fèi)用':'管理費(fèi)用(億元)','財務(wù)費(fèi)用':'財務(wù)費(fèi)用(億元)','營業(yè)總支出':'營業(yè)總支出(億元)','營業(yè)利潤':'營業(yè)利潤(億元)', '利潤總額':'利潤總額(億元)'})然后規(guī)范一下單位。這里需要用到正則表達(dá)式了。
兩個正則表達(dá)式,分別匹配所有“萬”“億”為單位的金額;
#引入正則表達(dá)式,去除萬億等單位 wan_pattern = re.compile('(?P<amount>(-|)d{1,4}[萬])') yi_pattern = re.compile('(?P<amount>(-|)d*.*d*[億])')轉(zhuǎn)換為億元
def amt_process(amt):str1=str(amt)if wan_pattern.search(str1):new_amt=float(str1.rstrip("萬"))/10000 #去掉“萬”結(jié)尾并除以10000return('{:.3f}'.format(new_amt)) #保留三位小數(shù)elif yi_pattern.search(str1):new_amt=float(str1.rstrip("億")) #直接去掉“億”結(jié)尾return('{:.2f}'.format(new_amt)) #保留兩位小數(shù)else:return(amt)df=df.applymap(amt_process) #對DataFrame所有元素應(yīng)用數(shù)值處理函數(shù)輸出一下DataFrame,看上去好像沒什么不對:
但是輸出Excel以后,出現(xiàn)了問題
df.to_excel(r"電子信息行業(yè)利潤表(已整理).xlsx",sheet_name="利潤表",index=False)正則表達(dá)式處理之后,輸出的全部為文本型數(shù)值。
問題出在哪里呢?我們發(fā)現(xiàn),出錯的列,數(shù)據(jù)類型都不是我們需要的float64
看到了這兩篇文章:
乘風(fēng):Pandas數(shù)據(jù)類型轉(zhuǎn)換的幾個小技巧
Pandas DataFrame將多列數(shù)據(jù)一次性從object轉(zhuǎn)換為datetime
決定試試
amount=[] for x in df.columns.tolist():if "(億元)" in x:amount.append(x)df[amount]=df[amount].apply(pd.to_numeric)最后輸出
輸出結(jié)果如圖歡迎各位批評指正。
總結(jié)
以上是生活随笔為你收集整理的python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端能读取压缩包内容吗?_解决前端多环境
- 下一篇: python开发小型数据库_python