如何在Python中优化在大数据帧上迭代的代码
我有一个大熊猫数据框。它有数千列和超过一百万行。我想按行计算最大值和最小值之间的差值。请记住,有许多NaN值,有些行都是NaN值(但我仍然希望保留它们!) 我编写了以下代码。它可以工作,但很耗时:如何在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 =
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点:
df.replace(['inf','nan',[0,0])
。它替换inf和nan值我对迭代也有同样的问题。2点:
df.replace(['inf','nan',[0,0])
。它替换inf和nan值使用
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,我的数据将不再代表我的情况。我也同意你的帖子红色。避免循环是关键。