1

解析する必要がある非常に大きなデータ ファイルがあります。私はいくつかのグループ関数を作成し、辞書を使用して、小さなデータ セットを機能させることができました。

ただし、より大きなデータセットは機能しません。csv ファイルでのデータセットの外観は次のとおりです。

123.0001, 'axis a', 'axis b', 'axis c'
123.0002, 'axis a', 'axis b', 'axis c'
123.0003, 'axis a', 'axis b', 'axis c'
123.0003, 'axis a', 'axis b', 'axis c'
123.0009, 'axis a', 'axis b', 'axis c'

ファイルは約20GBです。パンダを使用してこのファイルをロードし、間隔で時間ごとにグループ化したいと考えています。123.0001 はエポック時間で、何百もあります。ただし、それらは線形ではありません。つまり、数秒スキップする可能性があります。また、同じ 1 秒間にいくつかの異なるイベントが記録される場合もあります。さらにはマイクロ秒。

それらを1分間隔のチャンクにグループ化し、設定された間隔内にいくつあるかを数えたいとします。

パンダを使用してどうすればよいですか?

注、標準の辞書とリストを使用して、パンダなしでこれを既に機能させています。ただし、大規模なデータセットの結果を生成するには、約 3 時間かかります。

より良い解決策がある場合は、お知らせください。

4

2 に答える 2

1

でファイルを読み込みますdf = read_csv(filename, header=None)。次に、次のようなものを使用して最初の列をタイムスタンプに変換します...

nanoseconds = (10e9*df[0]).astype('int')
df[0] = nanoseconds.apply(pd.Timestamp)

ここで、エポック時間が秒単位であると想定し、ナノ秒に変換しました。

次に、パンダのグループ化および/またはリサンプル機能を使用して、やりたいことを何でもします。

関連する質問と、これをより厄介にする今後の改善に関する情報については、あなたの質問に対する私のコメントのリンクを参照してください。

于 2013-06-10T21:15:32.910 に答える
0

CSV ファイルはかなり大きいため、チャンクで読み取る必要がある場合があります。groupby/count 操作によって各チャンクのサイズを縮小し、(縮小された) チャンクを連結できます。結果の DataFrame には同一のインデックスを持つ行が含まれる可能性があるため (異なるチャンクの行は同じtimestamp//60を持つため)、groupby/sum 操作を実行して、同一のインデックスを持つ行のカウントを結合する必要があります。

import pandas as pd
# Choose chunksize to be a large but manageable number of lines
chunksize = 10**5
chunks = pd.read_csv(filename, chunksize=chunksize, header=None)
freqs = pd.concat(chunk.groupby(chunk[0]//60).count() for chunk in chunks)
freqs = freqs.groupby(freqs.index).sum()

1.3GB のファイルでは、上記のコードは私のマシンで約 150 秒で実行されます。したがって、20 GB のファイルの処理には 1 時間もかかりません。

于 2013-06-11T00:37:06.913 に答える