pandas數據分析輸出excel產生文本形式存儲的百分比數據,如何處理?

  • 2019 年 10 月 3 日
  • 筆記

關鍵詞

python、pandas、to_excel、文本形式存儲的數據

需求描述

我用 python pandas 寫了數據統計與分析腳本,並把計算結果用 pandas 的 to_excel() 存入到 excel 表格提交給團隊。但遇到一個問題:當我的老闆和同事們打開 excel 文件時,發現百分比數值無法正常顯示,提示為「文本形式存儲的數據」。

image

想讓此類百分比數值正常顯示,我該怎麼辦呢?

image

解決思路

1、必須從自己身上找解決方案。在工作中,當我們需要輸出文檔給團隊查閱,必須自己為文檔的品質負責,而非要求或期望我的老闆和同事來處理。

2、立即生效、簡單好用的笨辦法。

手動打開excel文件,選中「文本形式存儲的數據」的一列數據,點擊「數據 – 分列」 在彈出的菜單中點擊兩次「下一次」,然後點擊「完成」即可。每次操作只能選中一列數據,如果有多列數據,就要分別操作多次。沒辦法偷懶。

image

該方法看上去有點粗笨,但在緊急情況下,你能立即用,馬上解決問題。

如果單個文件中此類「文本形式存儲的數據」較多,或你需要頻繁輸出該類文件,那麼當然更好的做法是:直接優化腳本,從根源上解決問題。

解決方案

0、初始腳本

為了完成這篇學習筆記,我把此類情況的最小情境構建一些數據,寫個小腳本,如下:

  import pandas as pd    #構建一組數據  df = pd.DataFrame([['文章閱讀量', 982000],                     ['查看原文訪問詳情頁', 8912],                     [ '翻到詳情頁底部', 4514],                     [ '點擊購買', 1207],                     ['支付成功', 124]],                     columns=['action','count'])    # 根據數據計算絕對轉化率、相對轉化率  df['abs_rate'] = df['count']/df['count'].values[0]  df['opp_rate'] = (df['count'].shift(axis=0,periods=-1))/df['count']  df = df.fillna(0)    # 設置百分比數據的顯示  df['abs_rate'] = df['abs_rate'].apply(lambda x:format(x, '.2%'))  df['opp_rate'] = df['opp_rate'].apply(lambda x:format(x, '.2%'))    df.to_excel('result.xlsx', index=False)  

1、單個子表,改用 to_csv() 方法

如果只有一個表格,那麼可不再使用 to_excel() 而是改用 to_csv()。具體程式碼為:

  df.to_csv('result.csv',encoding='utf_8_sig',sep=',',index=False)  

裡面的兩個關鍵參數,解釋一下:

  • encoding='utf_8_sig' 而不是默認的 utf-8 是為了解決中文亂碼問題;
  • index=False 則是不寫入 dataframe 數據類型的 index 那列無意義數據。

但實際情況是,數據統計分析的輸出,通常有多個子表構成,所以還是得用回 to_excel() 吖!

2、多個子表,束手無措,作出取捨

我搜了非常多網頁,尚未找到直接解決問題的方法。在這種情況下,我只能從以下2個結果中二選一:

  • 顯示為百分數,打開 excel 表格時有異常提示:以文本形式存儲的數據(即現狀)
  • 顯示為小數,打開excel 表格時無異常提示

想要顯示為小數,則直接注釋掉腳本中的 2 句百分數格式設置語句即可。

  #df['abs_rate'] = df['abs_rate'].apply(lambda x:format(x, '.2%'))  #df['opp_rate'] = df['opp_rate'].apply(lambda x:format(x, '.2%'))  

真是不甘心吖!!希望有天能找到答案,更新本文!筆記先落筆至此吧!

btw,您有解決辦法嗎?當需要把dataframe數據輸出到excel並有多個子表時,如何能讓百分數正常顯示,而無任何異常提示呢?