1. 程式人生 > >pandas資料分析輸出excel產生文字形式儲存的百分比資料,如何處理?

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