2017-07-08 10 views
2

大きなCSVファイルを読み込み、コードを実行しようとしています。私は同じようにチャンクサイズを使用します。パンダのチャンクサイズによるエラーの解決方法

file = "./data.csv" 
df = pd.read_csv(file, sep="/", header=0,iterator=True, chunksize=1000000, dtype=str) 
print len(df.index) 

私は、コード内で次のエラーを取得する:

AttributeError: 'TextFileReader' object has no attribute 'index' 

これを解決する方法は?

+0

上記のコードがこれらのエラーを投げる方法はありません。完全なコードとトレースバックを共有してください。また、 'iterator'パラメータを' True'に設定すると、返されるのはデータフレームではありません。これは 'chunksize'パラメータに渡される整数のデータフレームのイテレータです。基本的に、複数のデータフレームにアクセスするには、 'df'変数をループする必要があります。 – Abdou

+0

詳しい説明ができますか? –

+0

さらにコードと完全なトレースバック/エラーを共有していただければ幸いです。要点は、変数 'df'はデータフレームではないということです。データフレームの[iterator'](http://pandas.pydata.org/pandas-docs/stable/io.html#io-chunking)です。 'iterator'をループすることで、データフレームにアクセスすることができます。例えば、 – Abdou

答えて

2

これらのエラーは、pd.read_csvコールがこの場合はDataFrameオブジェクトを返さないという事実に起因しています。代わりにオブジェクトを返します。このオブジェクトはiteratorです。これは、基本的に、パラメータをTrueに設定した場合、返されるのはDataFrameではないためです。 chunksizeパラメータ(この場合は1000000)に渡される整数の各データフレームオブジェクトのiteratorです。 具体的にはdf.indexを呼び出すことはできません。単にiteratorオブジェクトにindexという属性がないためです。これは、iterator内のDataFramesにアクセスできないという意味ではありません。つまり、一度にDataFrameにアクセスするためにイテレータをループするか、またはそれらのすべてを1つの巨大なものに連結する何らかの方法を使用する必要があります。

あなただけ一度に一つのDataFrameで作業を検討している場合は、次はあなたが各DataFrameのインデックスを印刷するために必要となるものです。

file = "./data.csv" 
dfs = pd.read_csv(file, sep="/", header=0,iterator=True, chunksize=1000000, dtype=str) 

for df in dfs: 
    print(df.index) 
    # do something 
    df.to_csv('output_file.csv', mode='a', index=False) 

この出力にDataFramesを保存しますファイル名はoutput_file.csvです。 modeパラメータをaに設定すると、操作がファイルに追加されます。その結果、上書きする必要はありません。あなたはすでにここiteratorパラメータを使用しているので、私は、

file = "./data.csv" 
dfs = pd.read_csv(file, sep="/", header=0,iterator=True, chunksize=1000000, dtype=str) 

giant_df = pd.concat(dfs) 

print(giant_df.index) 

:あなたの目標は、1つの巨大なDataFrameにすべてのデータフレームを連結する場合

しかし、その後、次はおそらく、より適切なパスになりますあなたは記憶を心配していると思います。このように、最初の戦略はより良いものになるでしょう。基本的には、大きなデータセットのメモリ管理に関して、iteratorsが提供する利点を利用していることを意味します。

私はこれが有用であることを望みます。

+0

私は別の疑問を持っています:)私はこのforloopの中でコードを実行しています。私はchunkksizeを使用しているので、始めに1000行しか実行されません。私は最終的に出力を保存します。 1000行のセットが選択されるたびに出力ファイルが上書きされるか、または出力ファイルに完全入力が出力されますか? –

+0

はい。私はコマンドを使用してCSVファイルにそれを保存しています:df。 to_csv –

+0

ありがとうございます!!!!!! –

関連する問題