如何优化在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)
任何建议将不胜感激!
它通常是一个坏主意,使用python
for
循环遍历大pandas.DataFrame
或numpy.ndarray
。您应该使用可用的构建函数,因为它们已经过优化,并且在很多情况下实际上不是用python编写的,而是以编译语言编写的。在你的情况下,你应该使用方法pandas.DataFrame.max和pandas.DataFrame.min,这两个方法都会给你一个选项skipna
跳过你的DataFrame
中的nan
值,而不需要手动实际丢弃它们。此外,您可以选择axis
以最小化。因此,您可以指定axis=1
以获得沿列的最小值。
这加起来的什么@EdChum在评论刚才提到类似的事情:
data.max(axis=1, skipna=True) - data.min(axis=1, skipna=True)
我有关于迭代的相同问题。 2分:
- 为什么不用0代替NaN值?你可以用这个
df.replace(['inf','nan'],[0,0])
做到这一点。它取代了inf和nan值。 - 看看这个This。也许你可以理解,我有一个类似的问题,关于如何优化循环来计算实际行与前一行之间的差异。
Hi Juliana。我不用0代替NaN值,因为在我的情况下NaN意味着缺失,0是可能的测量。如果我用0代替NaN,我的数据将不再代表我的情况。我也同意你分享的帖子。关键是避免循环。 –
IIUC你可以做'date.max(轴= 1) - data.min(轴= 1) ' – EdChum
你应该避免使用循环和'apply'并且像我建议的那样搜索矢量化方法,大多数熊猫操作将优雅地处理'NaN',然后需要在操作之前或之后过滤掉 – EdChum