pandas資料分析輸出excel產生文字形式儲存的百分比資料,如何處理?
關鍵詞:
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並有多個子表時,如何能讓百分數正常顯示,而無任何異常提示呢