将二进制数据读入熊猫

时间:2013-05-15 19:07:56

标签: python pandas numpy

我有一些二进制数据,我想知道如何将其加载到pandas中。

我可以以某种方式加载它,指定它所在的格式,以及调用各个列的内容吗?

修改
格式为

int, int, int, float, int, int[256]

每个逗号分隔代表数据中的一列,即最后256个整数是一列。

4 个答案:

答案 0 :(得分:17)

虽然这是一个老问题,但我想知道同样的事情,我没有看到我喜欢的解决方案。

使用Python读取二进制数据时,我发现numpy.fromfilenumpy.fromstring要比使用Python结构模块快得多。只要数据格式是常量并且可以用numpy数据类型对象(numpy.dtype)来描述,具有混合类型的二进制数据可以使用上述方法有效地读入numpy数组。

import numpy as np
import pandas as pd

# Create a dtype with the binary data format and the desired column names
dt = np.dtype([('a', 'i4'), ('b', 'i4'), ('c', 'i4'), ('d', 'f4'), ('e', 'i4'),
               ('f', 'i4', (256,))])
data = np.fromfile(file, dtype=dt)
df = pd.DataFrame(data)

# Or if you want to explicitly set the column names
df = pd.DataFrame(data, columns=data.dtype.names)

<强>编辑:

  • 删除了data.to_list()的不必要转换。谢谢fxx
  • 添加了取消columns参数
  • 的示例

答案 1 :(得分:10)

最近我遇到了类似的问题,但结构要大得多。我想我发现使用实用方法 DataFrame.from_records 改进了mowen的答案。在上面的例子中,这将给出:

delegate.dataArray

就我而言,它显着加快了这个过程。我假设改进来自于不必创建中间Python列表,而是直接从Numpy结构化数组创建DataFrame。

答案 2 :(得分:1)

这是让你入门的东西。

from struct import unpack, calcsize
from pandas import DataFrame

entry_format = 'iiifi256i' #int, int, int, float, int, int[256]
field_names = ['a', 'b', 'c', 'd', 'e', 'f', ]
entry_size = calcsize(entry_format)

with open(input_filename, mode='rb') as f:
    entry_count = os.fstat(f.fileno()).st_size / entry_size
    for i in range(entry_count):
        record = f.read(entry_size)
        entry = unpack(entry_format, record)
        entry_frame = dict( (n[0], n[1]) for n in zip(field_names, entry) )
        DataFrame(entry_frame)

答案 3 :(得分:1)

以下使用编译的结构,比普通结构快得多。 另一种方法是使用np.fromstring或np.fromfile,如上所述。

import struct, ctypes, os
import numpy as np, pandas as pd 

mystruct = struct.Struct('iiifi256i')
buff = ctypes.create_string_buffer(mystruct.size)
with open(input_filename, mode='rb') as f:
    nrows = os.fstat(f.fileno()).st_size / entry_size
    dtype = 'i,i,i,d,i,i8'
    array = np.empty((nrows,), dtype=dtype)
    for row in xrange(row):
        buff.raw = f.read(s.size)
        record = mystruct.unpack_from(buff, 0)
        #record = np.fromstring(buff, dtype=dtype)
        array[row] = record
 df = pd.DataFrame(array)

另见http://pymotw.com/2/struct/