在Pandas DataFrame上进行迭代

时间:2019-08-29 22:57:02

标签: python pandas dataframe for-loop iteration

迭代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上已经解决的问题,我也深表歉意:尽管如此,我并不十分了解这个问题的常规答案。可能重复,但是对于新手来说,如果不太全面的话,这个答案就很容易理解。

1 个答案:

答案 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行。