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

關鍵詞

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並有多個子表時,如何能讓百分數正常顯示,而無任何異常提示呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章