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

时间:2016-09-16 09:18:22

标签: python pandas optimization dataframe

我有一个大熊猫数据框。它有数千列和超过一百万行。我想逐行计算最大值和最小值之间的差异。请记住,有许多NaN值,有些行都是NaN值(但我仍然希望保留它们!)。

我写了以下代码。它有效,但耗费时间:

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)

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:2)

使用if (!Directory.Exists(_logPath)) { Directory.CreateDirectory(_logPath); } string logFile = Path.Combine(_logPath, "myApp.Log"); using (StreamWriter file = new StreamWriter(logFile, true)) { file.WriteLine(lines); file.Close(); }; python循环来迭代大forpandas.DataFrame通常是个坏主意。您应该优先使用它们中的可用内置函数,因为它们已经过优化,并且在许多情况下实际上不是用python编写的,而是使用编译语言编写的。在您的情况下,您应该使用方法pandas.DataFrame.maxpandas.DataFrame.min,这两种方法都会为您提供numpy.ndarray选项,以跳过skipna中的nan值,而无需实际手动放下它们。此外,您可以选择DataFrame来最小化。因此,您可以指定axis以获得最小的列。

这将与@EdChum在评论中提到的内容类似:

axis=1

答案 1 :(得分:0)

我对迭代有同样的问题。 2分:

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