24

バイナリデータがいくつかあり、それをパンダにロードする方法を知りたいと思っていました。

形式と個々の列の名前を指定してロードできますか?

編集:
フォーマットは

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

各コンマ区切りは、データの列を表します。つまり、最後の 256 個の整数が 1 つの列です。

4

4 に答える 4

38

これは古い質問ですが、同じことを考えていて、気に入った解決策が見つかりませんでした。

numpy.fromfilePython でバイナリ データを読み取る場合、Python struct モジュールを使用するよりもnumpy.fromstringはるかに高速であることがわかりました。型が混在するバイナリ データは、データ形式が一定で、numpy データ型オブジェクト ( ) で記述できる限り、上記の方法を使用して効率的に numpy 配列に読み込むことができますnumpy.dtype

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()。ありがとうございます
  • columns引数を省略する例を追加
于 2014-12-03T07:13:19.790 に答える
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/も参照してください

于 2014-12-16T12:24:37.590 に答える
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)
于 2013-05-16T21:59:22.410 に答える