Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中优化在大数据帧上迭代的代码_Python_Pandas_Optimization_Dataframe - Fatal编程技术网

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

如何在Python中优化在大数据帧上迭代的代码,python,pandas,optimization,dataframe,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 =

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

  • 为什么不将NaN值替换为0?您可以使用这个
    df.replace(['inf','nan',[0,0])
    。它替换inf和nan值
  • 看看这个。也许您可以理解,我有一个类似的问题,关于如何优化循环以计算实际行与前一行之间的de差
    我对迭代也有同样的问题。2点:

  • 为什么不将NaN值替换为0?您可以使用这个
    df.replace(['inf','nan',[0,0])
    。它替换inf和nan值
  • 看看这个。也许您可以理解,我有一个类似的问题,关于如何优化循环以计算实际行与前一行之间的de差
    使用
    python
    for
    循环来迭代大型
    pandas.DataFrame
    numpy.ndarray
    通常是个坏主意。您应该在它们上使用可用的内置函数,因为它们经过优化,在许多情况下实际上不是用python编写的,而是用编译语言编写的。在您的情况下,您应该使用这些方法,它们都为您提供了一个选项
    skipna
    来跳过
    DataFrame
    中的
    nan
    值,而无需手动删除它们。此外,您还可以选择一个
    ,以沿轴最小化。因此,您可以指定轴=1以获得沿列的最小值

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

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

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

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

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

    IIUC你可以只做
    date.max(axis=1)-data.min(axis=1)
    你应该避免使用循环和
    apply
    并像我建议的那样搜索向量化方法,大多数熊猫操作将优雅地处理
    NaN
    ,然后你需要在操作之前或之后过滤掉IIUC你可以只做
    date.max(axis=1)-data.min(轴=1)
    你应该避免使用循环和
    apply
    并像我建议的那样搜索向量化方法,大多数熊猫行动将优雅地处理
    NaN
    ,然后需要在操作之前或之后过滤掉
    skipna
    是默认值
    True
    ,因此没有必要:哦,很高兴知道,谢谢。我通常更喜欢解释cit大于隐式,并将保留它。
    skipna
    是默认值
    True
    ,因此它是不必要的:哦,很高兴知道,谢谢。我通常喜欢显式而不是隐式,并将保留它。嗨,朱丽安娜。我不会将NaN值替换为0,因为在我的例子中,NaN意味着缺失,0是一个可能的度量值。如果我将NaN替换为0,我的数据将不再代表我的情况。我也同意你共享的帖子。避免for循环是关键。嗨,朱丽安娜。我不会用0替换NaN值,因为在我的例子中NaN意味着缺失,0是一个可能的度量值。如果我用0替换NaN,我的数据将不再代表我的情况。我也同意你的帖子红色。避免循环是关键。