2017-05-25 54 views
-1

我需要能够遍历行并执行一些操作。以下是一些代码的开始。iterrows性能差,错误信息

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

为什么不这样做呢? 'vector = [row for i,row in 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 vs itertuples的文档?我已经看到帖子指出itertuples更快,但我发现的大多数教程都基于iterrows。感谢您的建议! – RMichalowski

+0

更多信息在这里:https://stackoverflow.com/questions/24870953/does-iterrows-have-performance-issues – misantroop