迭代DataFrames的(最佳实践)正确方法是什么?
我正在使用:
for i in range(working.shape[0]):
for j in range(1, working.shape[1]):
working.iloc[i,j] = (100 - working.iloc[i,j])*100
以上是正确的,但与其他Stack Overflow答案不符。我希望有人可以解释为什么上述方法不是最佳方法,并提出更好的实施方案。
我是一般编程的新手,尤其是熊猫。对于在SF上已经解决的问题,我也深表歉意:尽管如此,我并不十分了解这个问题的常规答案。可能重复,但是对于新手来说,如果不太全面的话,这个答案就很容易理解。
答案 0 :(得分:4)
迭代DataFrames的(最佳实践)正确方法是什么?
有几种方法(例如iterrows
),但是通常来说,您应该不惜一切代价避免迭代。熊猫提供了几种用于矢量化操作的工具,这些工具几乎总是比迭代解决方案要快。
您可以使用iloc
通过以下方式对您提供的示例进行矢量化处理:
working.iloc[:, 1:] = (100 - working.iloc[:, 1:]) * 100
一些时间:
from timeit import Timer
working = pd.DataFrame({'a': range(50), 'b': range(50)})
def iteration():
for i in range(working.shape[0]):
for j in range(1, working.shape[1]):
working.iloc[i, j] = (100 - working.iloc[i, j]) * 100
def direct():
# in actual code you will have to assign back to working.iloc[:, 1:]
(100 - working.iloc[:, 1:]) * 100
print(min(Timer(iteration).repeat(50, 50)))
print(min(Timer(direct).repeat(50, 50)))
输出
0.38473859999999993
0.05334049999999735
只有7行,只有50行。