2017-05-25 31 views
-1

行全体を繰り返し処理したり、何らかの操作を行う必要があります。以下はいくつかのコードの始まりです。itterrowsパフォーマンスが低下し、エラーメッセージが表示される

for i, row in df.iterrows(): 
    df.loc[i, 'Object'] = row 

パフォーマンスが途方もなく遅く、私は次の出力を得る:

A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

私が間違っているのは何を?

+1

'ベクトル= [i行、df.iterrows()内の行]; df ['Object'] = vector'?パフォーマンス面では、いくつかの改善が見られるかもしれませんが、警告で警告してはいけないことを明確にすることも避けてください。 – blacksite

+1

実際にはエラーではなく、警告であり、パフォーマンス上の問題とは関係ありません。この警告の詳細については、この[質問](https://stackoverflow.com/questions/20625582/how-to-deal-with-settingwithcopywarning-in-pandas)を参照してください。 –

+0

データフレームの行を繰り返し処理する必要はありませんが、関数/演算をベクトル化できれば、パフォーマンスが大幅に向上します。 –

答えて

0

データフレーム全体を繰り返し処理し、各行にlocを使用すると速度が遅くなります。代わりにこれを試してみてください。

df.ix[np.in1d(df['Object'], value) 
+0

ixは推奨されていません – piRSquared

0

をあなたは本当にあなたがループする必要があることが判明した場合は、使用itertuplesは、ほとんどの場合、それが何倍高速です。

df = pd.DataFrame({"Object": [1,2,3], "Lifeishard_butunfair": [2,3,4]}) 

objectCol = df.columns.get_loc("Object")+1 
for row in df.itertuples(): 
    someVar = row[objectCol] 
+0

iterrowsとitertuplesのどちらを使用するかを説明する文書は見つかりませんか? itertuplesは高速ですが、私が見つけたチュートリアルのほとんどはiterrowsに基づいていると書かれた記事を見ました。あなたの助言をありがとう! – RMichalowski

+0

詳細はこちら:https://stackoverflow.com/questions/24870953/does-iterrows-have-performance-issues – misantroop

関連する問題