日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...

發布時間:2025/3/20 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前情提要:蓬佩奧不怕開水燙:XLOOKUP函數簡單使用指南

之前這篇文章里面,是使用的word對報表進行處理,相對簡單快捷;但是,數據量比較大比較復雜的情況下,用word處理起來會有點吃力。

因此,我鉆研了一個下午,寫了個python腳本,中間還遇到不少問題,不過還是寫出來了,以后再處理類似的報表的時候,就不用再打開word了。

信息來源:東方財富Choice數據-2019年電子信息行業財務報表-利潤表

原始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整理的利润表实践...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。