前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas数据分析输出excel产生文本形式存储的百分比数据,如何处理?

pandas数据分析输出excel产生文本形式存储的百分比数据,如何处理?

作者头像
刘娟娟PRESSone
发布2019-10-25 16:58:23
3K0
发布2019-10-25 16:58:23
举报

关键词

python、pandas、to_excel、文本形式存储的数据

需求描述

我用 python pandas 写了数据统计与分析脚本,并把计算结果用 pandas 的 to_excel() 存入到 excel 表格提交给团队。但遇到一个问题:当我的老板和同事们打开 excel 文件时,发现百分比数值无法正常显示,提示为“文本形式存储的数据”。

image
image

想让此类百分比数值正常显示,我该怎么办呢?

image
image

解决思路

1、必须从自己身上找解决方案。在工作中,当我们需要输出文档给团队查阅,必须自己为文档的质量负责,而非要求或期望我的老板和同事来处理。

2、立即生效、简单好用的笨办法。

手动打开excel文件,选中“文本形式存储的数据”的一列数据,点击“数据 - 分列” 在弹出的菜单中点击两次“下一次”,然后点击“完成”即可。每次操作只能选中一列数据,如果有多列数据,就要分别操作多次。没办法偷懒。

image
image

该方法看上去有点粗笨,但在紧急情况下,你能立即用,马上解决问题。

如果单个文件中此类“文本形式存储的数据”较多,或你需要频繁输出该类文件,那么当然更好的做法是:直接优化脚本,从根源上解决问题。

解决方案

0、初始脚本

为了完成这篇学习笔记,我把此类情况的最小情境构建一些数据,写个小脚本,如下:

代码语言:javascript
复制
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()。具体代码为:

代码语言:javascript
复制
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 句百分数格式设置语句即可。

代码语言:javascript
复制
#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并有多个子表时,如何能让百分数正常显示,而无任何异常提示呢?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键词:
  • 需求描述:
  • 解决思路:
  • 解决方案:
    • 0、初始脚本
      • 1、单个子表,改用 to_csv() 方法
        • 2、多个子表,束手无措,作出取舍
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档