如何优化在Python中的大数据框上迭代的代码

问题描述:

我有一个大熊猫数据框。它有数千列和超过一百万行。我想要计算最大值和最小值之间的差异。请记住,有许多NaN值和一些行都是NaN值(但我仍想保留它们!)。如何优化在Python中的大数据框上迭代的代码

我写了下面的代码。它的工作,但它很费时间:

totTime = [] 
for index, row in date.iterrows(): 
    myRow = row.dropna() 
    if len(myRow): 
     tt = max(myRow) - min(myRow) 
    else: 
     tt = None 
    totTime.append(tt) 

有没有什么办法来优化它?我试着用下面的代码,但我得到一个错误,当它遇到所有NaN行:

tt = lambda x: max(x.dropna()) - min(x.dropna()) 
totTime = date.apply(tt, axis=1) 

任何建议将不胜感激!

+3

IIUC你可以做'date.max(轴= 1) - data.min(轴= 1) ' – EdChum

+3

你应该避免使用循环和'apply'并且像我建议的那样搜索矢量化方法,大多数熊猫操作将优雅地处理'NaN',然后需要在操作之前或之后过滤掉 – EdChum

它通常是一个坏主意,使用pythonfor循环遍历大pandas.DataFramenumpy.ndarray。您应该使用可用的构建函数,因为它们已经过优化,并且在很多情况下实际上不是用python编写的,而是以编译语言编写的。在你的情况下,你应该使用方法pandas.DataFrame.maxpandas.DataFrame.min,这两个方法都会给你一个选项skipna跳过你的DataFrame中的nan值,而不需要手动实际丢弃它们。此外,您可以选择axis以最小化。因此,您可以指定axis=1以获得沿列的最小值。

这加起来的什么@EdChum在评论刚才提到类似的事情:

data.max(axis=1, skipna=True) - data.min(axis=1, skipna=True) 
+2

'skipna'默认为'True',所以不需要:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html – EdChum

+0

哦,很高兴知道,谢谢。我通常更喜欢显式的隐含,并会保留它。 – jotasi

我有关于迭代的相同问题。 2分:

  1. 为什么不用0代替NaN值?你可以用这个df.replace(['inf','nan'],[0,0])做到这一点。它取代了inf和nan值。
  2. 看看这个This。也许你可以理解,我有一个类似的问题,关于如何优化循环来计算实际行与前一行之间的差异。
+0

Hi Juliana。我不用0代替NaN值,因为在我的情况下NaN意味着缺失,0是可能的测量。如果我用0代替NaN,我的数据将不再代表我的情况。我也同意你分享的帖子。关键是避免循环。 –