【发布时间】:2018-05-24 17:53:20
【问题描述】:
我有一个 pandas 数据框,我想根据是否满足某些条件进行过滤。我运行了一个循环和一个.apply() 并使用%%timeit 来测试速度。数据集大约有 45000 行。 sn -p for 循环的代码是:
%%timeit
qualified_actions = []
for row in all_actions.index:
if all_actions.ix[row,'Lower'] <= all_actions.ix[row, 'Mid'] <= all_actions.ix[row,'Upper']:
qualified_actions.append(True)
else:
qualified_actions.append(False)
每个循环 1.44 秒 ± 3.7 毫秒(平均值 ± 标准偏差。7 次运行,每个循环 1 个)
对于.apply() 是:
%%timeit
qualified_actions = all_actions.apply(lambda row: row['Lower'] <= row['Mid'] <= row['Upper'], axis=1)
每个循环 6.71 秒 ± 54.6 毫秒(7 次运行的平均值 ± 标准偏差,每次 1 个循环)
我认为.apply() 应该比在 pandas 中循环遍历要快得多。有人可以解释为什么在这种情况下它会变慢吗?
【问题讨论】:
-
我不确定知道,但我猜这是因为
apply必须为每个人构造一个dict排。同时,您的for方法使用ix有效地访问数据,而无需构造任何新对象。我相信这只会在您应用 Python 函数时发生;应用 numpy 函数,您将留在 C 领域,事情进展得很快。 -
.apply是 not 假设在遍历行时更快。.apply本质上是引擎盖下的一个 for 循环,如果你继续使用 axis=1。见here -
@Amadan 实际上,它在每一行中构造了一个
Series,但是是的,效果相同。
标签: python pandas performance