假设我们有一个函数
最近的pandas更新开始引起以下警告:
上述代码解决了警告问题,但执行时间变得更糟糕了。
一个用于抑制性能警告并引入额外开销的修复看起来很愚蠢。因此我的问题是:
如何在保持更好性能的同时修复这个警告呢?换句话说,是否有一种方法可以改进函数foo2以提供比foo更好的性能?
bar(df)
,给定一个dataframedf
,返回一个长度为 len(df)
的numpy数组。
现在考虑这个用法:def foo(df):
for i in range(N):
df['FOO_' + str(i)] = bar(df)
return df
最近的pandas更新开始引起以下警告:
据我所知,缓解此问题的方法是将上述代码更改为以下惯用语。性能警告:DataFrame高度碎片化。这通常是由于多次调用
frame.insert
导致的,其性能较差。考虑使用pd.concat(axis=1)将所有列一起连接,而不是逐个添加。要获得非碎片化的数据帧,请使用newframe = frame.copy()
def foo2(df):
frames = [df]
for i in range(N):
frames += [pd.Series(bar(df), index=df.index)]
return pd.concat(frames, axis=1)
上述代码解决了警告问题,但执行时间变得更糟糕了。
In [110]: %timeit foo()
1.73 s ± 11 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [111]: %timeit foo2()
2.51 s ± 25.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
一个用于抑制性能警告并引入额外开销的修复看起来很愚蠢。因此我的问题是:
如何在保持更好性能的同时修复这个警告呢?换句话说,是否有一种方法可以改进函数foo2以提供比foo更好的性能?
N
是否等于df
的长度?此外,我认为foo
不会运行,因为它在你的例子中是这样写的:df[i]
查找的是第i
列,而不是第i
行。另一个问题是foo
会覆盖传入的DataFramedf
。 - Peter Leimbiglerbar()
函数体吗? - Danila Ganchar