關鍵詞:
python、pandas、to_excel、文本形式存儲的數據
需求描述:
我用 python pandas 寫了數據統計與分析腳本,並把計算結果用 pandas 的 to_excel()
存入到 excel
表格提交給團隊。但遇到一個問題:當我的老板和同事們打開 excel
文件時,發現百分比數值無法正常顯示,提示為“文本形式存儲的數據”。
想讓此類百分比數值正常顯示,我該怎么辦呢?
解決思路:
1、必須從自己身上找解決方案。在工作中,當我們需要輸出文檔給團隊查閱,必須自己為文檔的質量負責,而非要求或期望我的老板和同事來處理。
2、立即生效、簡單好用的笨辦法。
手動打開excel文件,選中“文本形式存儲的數據”的一列數據,點擊“數據 - 分列” 在彈出的菜單中點擊兩次“下一次”,然后點擊“完成”即可。每次操作只能選中一列數據,如果有多列數據,就要分別操作多次。沒辦法偷懶。
該方法看上去有點粗笨,但在緊急情況下,你能立即用,馬上解決問題。
如果單個文件中此類“文本形式存儲的數據”較多,或你需要頻繁輸出該類文件,那么當然更好的做法是:直接優化腳本,從根源上解決問題。
解決方案:
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並有多個子表時,如何能讓百分數正常顯示,而無任何異常提示呢?