首页 > 解决方案 > 在不使用 for 循环的情况下将值应用于 DataFrame

问题描述

我正在寻找一种更快的方法将值应用于 DataFrame 中的列。该值基于True and False第一列和第二列中的两个值。这是我目前的解决方案:

df['result'] = df.check1.astype(int)

for i in range(len(df)):
    if df.result[i] != 1:
        df.result[i] = df.result.shift(1)[i] + df.check2[i].astype(int)

这产生了这个结果:

    check1  check2  result
0   True    False   1
1   False   False   1
2   False   False   1
3   False   False   1
4   False   False   1
5   False   False   1
6   False   True    2
7   False   False   2
8   False   True    3
9   False   False   3
10  False   True    4
11  False   False   4
12  False   True    5
13  False   False   5
14  False   True    6
15  False   False   6
16  False   True    7
17  False   False   7
18  False   False   7
19  False   False   7
20  False   True    8
21  False   False   8
22  False   True    9
23  True    False   1
24  False   False   1

因此,第三列需要是基于其上方行中的值的数字。如果 check1 为 True,则数字需要返回 1。如果 check2 为 true,则需要将 1 添加到数字。否则数字保持不变。

当前的代码很好,但是因为我需要将它应用到大约有 . 70.000 行。我很确定它可以改进(我猜是使用 apply 函数,但我不确定)。
有任何想法吗?

标签: pythonpandasdataframe

解决方案


使用pandas.DataFrame.groupby.cumsum

import pandas as pd

df['result'] = df.groupby(df['check1'].cumsum())[['check1', 'check2']].cumsum().sum(1)

或@Dan 的建议:

df['result'] = df.groupby(df['check1'].cumsum())['check2'].cumsum().add(1)

输出:

    check1  check2  result
0     True   False     1.0
1    False   False     1.0
2    False   False     1.0
3    False   False     1.0
4    False   False     1.0
5    False   False     1.0
6    False    True     2.0
7    False   False     2.0
8    False    True     3.0
9    False   False     3.0
10   False    True     4.0
11   False   False     4.0
12   False    True     5.0
13   False   False     5.0
14   False    True     6.0
15   False   False     6.0
16   False    True     7.0
17   False   False     7.0
18   False   False     7.0
19   False   False     7.0
20   False    True     8.0
21   False   False     8.0
22   False    True     9.0
23    True   False     1.0
24   False   False     1.0

推荐阅读