【问题标题】:How to optimize code that iterates on a big dataframe in Python如何优化在 Python 中对大数据帧进行迭代的代码
【发布时间】:2016-09-16 19:00:28
【问题描述】:

我有一个大熊猫数据框。它有数千列和超过一百万行。我想逐行计算最大值和最小值之间的差异。请记住,有很多 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)

任何建议将不胜感激!

【问题讨论】:

  • IIUC 你可以做date.max(axis=1) - data.min(axis=1)
  • 您应该避免使用循环和apply,并像我建议的那样搜索矢量化方法,大多数熊猫操作会优雅地处理NaN,然后您需要在操作之前或之后过滤掉跨度>

标签: python pandas optimization dataframe


【解决方案1】:

使用python for 循环遍历大的pandas.DataFramenumpy.ndarray 通常是个坏主意。您应该在它们上使用可用的内置函数,因为它们已经过优化,并且在许多情况下实际上不是用 python 编写的,而是用编译语言编写的。在您的情况下,您应该使用 pandas.DataFrame.maxpandas.DataFrame.min 方法,它们都为您提供了一个选项 skipna 以跳过 DataFrame 中的 nan 值,而无需实际手动删除它们。此外,您可以选择axis 来最小化。因此,您可以指定 axis=1 以获得沿列的最小值。

这将加起来类似于 @EdChum 刚刚在 cmets 中提到的内容:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 嗨朱莉安娜。我不会用 0 替换 NaN 值,因为在我的情况下,NaN 意味着缺失,而 0 是可能的测量值。如果我将 NaN 替换为 0,我的数据将不再代表我的情况。我也同意你分享的帖子。避免 for 循环是关键。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2021-07-09
  • 2019-02-09
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多