1

サイズが 800 GB の大きな csv からデータを解析しています。データの行ごとに、これを pandas データフレームとして保存します。

readcsvfile = csv.reader(csvfile)
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
    # save as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])

ここで、これを HDF5 形式に保存し、h5 を csv ファイル全体であるかのようにクエリします。

import pandas as pd
store = pd.HDFStore("pathname/file.h5")

hdf5_key = "single_key"

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]

これまでの私のアプローチは次のとおりです。

import pandas as pd
store = pd.HDFStore("pathname/file.h5")

hdf5_key = "single_key"

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
    # save as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])
    store.append(hdf5_key, df, data_columns=csv_columns, index=False)

つまり、各データフレームdfを 1 つのキーで HDF5 に保存しようとします。ただし、これは失敗します。

  Attribute 'superblocksize' does not exist in node: '/hdf5_key/_i_table/index'

したがって、最初にすべてを 1 つの pandas データフレームに保存しようとすることができます。

import pandas as pd
store = pd.HDFStore("pathname/file.h5")

hdf5_key = "single_key"

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)
total_df = pd.DataFrame()
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
    # save as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])
    total_df = pd.concat([total_df, df])   # creates one big CSV

HDF5形式に保存するようになりました

    store.append(hdf5_key, total_df, data_columns=csv_columns, index=False)

total_dfただし、すべての csv 行を HDF5 形式に保存するための RAM/ストレージがあるとは思いません。

では、各「単一行」の df を HDF5 に追加して、最終的に 1 つの大きなデータフレーム (元の csv など) になるようにするにはどうすればよいですか?

編集: データ型が異なる csv ファイルの具体的な例を次に示します。

 order    start    end    value    
 1        1342    1357    category1
 1        1459    1489    category7
 1        1572    1601    category23
 1        1587    1599    category2
 1        1591    1639    category1
 ....
 15        792     813    category13
 15        892     913    category5
 ....
4

1 に答える 1

1

コードが機能するはずです。次のコードを試してみてください:

import pandas as pd
import numpy as np

store = pd.HDFStore("file.h5", "w")
hdf5_key = "single_key"
csv_columns = ["COL%d" % i for i in range(1, 56)]
for i in range(10):
    df = pd.DataFrame(np.random.randn(1, len(csv_columns)), columns=csv_columns)
    store.append(hdf5_key, df,  data_column=csv_columns, index=False)
store.close()

コードが機能する場合は、データに問題があります。

于 2016-10-10T00:57:38.330 に答える