[pandas/streamlit] 通过IO流读取DataFrame.info中数据

以下内容挺啰嗦的 包含三个部分

  1. 事件背景(可以略过 我只是说一下为什么突然涉及这个问题
  2. 基本解决法(可以举一反三获取IO流中的其他数据
  3. 如何让它在streamlit中更美观地展示 (这个是记录教程的最终目的,仅供参考

1. 事件背景

在数据科学大多场景下,我们基本是在jupyter notebook上进行数据分析操作。很多信息我们都只是查看就足够而不需要读除来。 比如 DataFrame.info, 在jupyter上我们看到的是这样子的
在这里插入图片描述
但实际上这并不是它返回的数值(查看文档可以知道DataFrame.inforeturnNone),也就是说,我们看到的这一段实际上是这个函数运行过程中print出来的东西。

这次是因为在做一个streamlit小项目,需要将这一部分展示出来,用st.write(df.info())的话界面上输出是None, 如果采用magic commands(streamlit中类似jupyter上的输出方法)则是一片空白。 但是我们在后台可以看到是有输出流的,这样也就有入手点了。(之前没注意这些查了半天都无,最后发现官方文档是有相关案例的orz
在这里插入图片描述

在这里插入图片描述

基本解决方法

首先提一下流,流代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。用来进行输入输出操作的流就称为IO流。(百度一下就知道这里不多说,具体的可以看看python3之模块io使用流的核心工具
可以判断一下,我们要读取的是文本IO,文本IO产生的是str对象,这样就很快乐了。知道了这些我们再看看DataFrame.info的文档中buf这个参数。在这边我们就可以知道默认是把东西塞进sys.stdout管道(提示一下 print相当于sys.stdout.write)。那我们要做的就是把原本塞进sys.stdout管道的东西改成塞进缓冲区buffer,然后把缓冲区里的内容读出来。
在这里插入图片描述
好嘞 上代码👇

# -*- coding: utf-8 -*-
"""
Created on Sat Feb 20 14:06:54 2021
@author: mizuk
@email: rinmizuki123@gmail.com
It is our pain that makes us all human after all
"""
import pandas as pd
import numpy as np
import streamlit as st
import io

"""
info
"""
def main():
    """Description of main()"""
    df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                       columns=['a', 'b', 'c'])
    buffer = io.StringIO()
    df.info(buf=buffer)
    st.write(buffer.getvalue())
if __name__ == '__main__':
    main()

结果如下:内容很好的输出了
在这里插入图片描述
用以上这个方法我们也可以将这些内容写入文件中或者其他地方这样子

如何让它在streamlit中更美观地展示

在上面我们已经达成了输出结果,但是就很丑啊!!!!
那要怎么改!!!!!!!!!!
(答案是没有(x
尝试了好几种 包括存储为txt后再拿出来这样子 但是都好麻烦 其实我们会用到的只有non-null count 和data type, 从这个角度看,其实自己写更合适也不费时(x
代码就不po了以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值