如何将字节数据转换为 python pandas 数据框?

Posted

技术标签:

【中文标题】如何将字节数据转换为 python pandas 数据框?【英文标题】:How to convert bytes data into a python pandas dataframe? 【发布时间】:2018-05-02 22:22:15 【问题描述】:

我想将“字节”数据转换为 Pandas 数据框。

数据如下所示(前几行):

    (b'#Settlement Date,Settlement Period,CCGT,OIL,COAL,NUCLEAR,WIND,PS,NPSHYD,OCGT'
 b',OTHER,INTFR,INTIRL,INTNED,INTEW,BIOMASS\n2017-01-01,1,7727,0,3815,7404,3'
 b'923,0,944,0,2123,948,296,856,238,\n2017-01-01,2,8338,0,3815,7403,3658,16,'
 b'909,0,2124,998,298,874,288,\n2017-01-01,3,7927,0,3801,7408,3925,0,864,0,2'
 b'122,998,298,816,286,\n2017-01-01,4,6996,0,3803,7407,4393,0,863,0,2122,998'

列标题显示在顶部。随后的每一行都是一个时间戳和数字。

有没有直接的方法来做到这一点?

非常感谢

@Paula Livingstone:

这似乎有效:

s=str(bytes_data,'utf-8')

file = open("data.txt","w") 

file.write(s)
df=pd.read_csv('data.txt')

也许这可以在不使用中间文件的情况下完成。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并从这里的答案中找到了这个库https://docs.python.org/2/library/stringio.html:How to create a Pandas DataFrame from a string

尝试类似:

from io import StringIO

s=str(bytes_data,'utf-8')

data = StringIO(s) 

df=pd.read_csv(data)

【讨论】:

如果您从子流程模块获得bytes,那么s = subprocess.check_output(['docker', 'images']) s1=str(s,'utf-8') data = pd.read_fwf(StringIO(s1)) 可能会有所帮助【参考方案2】:

你也可以直接使用BytesIO

from io import BytesIO

df = pd.read_csv(BytesIO(bytes_data))

这将为您省去将bytes_data 转换为字符串的步骤

【讨论】:

【参考方案3】:

好的,很酷,您的输入格式很尴尬,但以下方法有效:

with open('file.txt', 'r') as myfile:
    data=myfile.read().replace('\n', '') #read in file as a string

df = pd.Series(" ".join(data.strip(' b\'').strip('\'').split('\' b\'')).split('\\n')).str.split(',', expand=True)

print(df)

这会产生以下结果:

                 0                  1     2    3     4        5      6   7   \
0  #Settlement Date  Settlement Period  CCGT  OIL  COAL  NUCLEAR   WIND  PS   
1        2017-01-01                  1  7727    0  3815     7404   3923   0   
2        2017-01-01                  2  8338    0  3815     7403   3658  16   
3        2017-01-01                  3  7927    0  3801     7408   3925   0   

       8      9      10     11      12      13     14       15  
0  NPSHYD  OCGT   OTHER  INTFR  INTIRL  INTNED  INTEW  BIOMASS  
1     944      0   2123    948     296     856    238           
2     909      0   2124    998     298     874    288           
3     864      0   2122    998     298     816    286     None 

为了使其工作,您需要确保您的输入文件仅包含完整行的集合。出于这个原因,出于测试的目的,我删除了部分行。

正如您所说,数据源是一个 http GET 请求,那么初始读取将使用 pandas.read_html 进行。

更多详情请见here。请特别注意有关 io 的部分(io : str 或类似文件)。

【讨论】:

谢谢。我的输入不是来自文件。我将文件创建为中间步骤,但我想完全避免使用文件。 通过 API 从 HTTP 请求中查询,我以问题中显示的字节格式获取它

以上是关于如何将字节数据转换为 python pandas 数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Pandas DataFrame转换为类似字节的对象

如何将 pandas 数据框列转换为本机 python 数据类型?

如何将python中的类转换为pandas数据框?

如何在python中使用pandas将字典列表转换为数据框[重复]

如何将带有元组键的 python 字典转换为 pandas 多索引数据框?

Python:如何将 Pandas Dataframe 行值转换为单个列?