Python 将值应用于数据帧而不使用for循环

Python 将值应用于数据帧而不使用for循环,python,pandas,dataframe,Python,Pandas,Dataframe,我正在寻找一种更快的方法,将值应用于数据帧中的列。该值基于第一列和第二列中的两个True和False值。这是我当前的解决方案: df['result']=df.check1.astype(int) 对于范围内的i(len(df)): 如果df.result[i]!=1: df.result[i]=df.result.shift(1)[i]+df.check2[i].astype(int) 这就产生了这个结果: check1 check2 result 0 True Fal

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

df['result']=df.check1.astype(int)
对于范围内的i(len(df)):
如果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函数,但我不确定)。
有什么想法吗?

使用
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

您希望使用前一行的值迭代数据帧。在这种情况下,最有效的方法是直接迭代底层numpy数组:

df = pd.read_fwf(io.StringIO(t))

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

res = df['result'].values
c1 = df['check1'].values
c2 = df['check2'].values
old = -1
for i in range(len(df)):
    if res[i] != 1:
        res[i] = old + int(c2[i])
    old = res[i]
这很好,因为numpy数组是可变类型,所以更改会反映在数据帧中

Timeit说,这是@Chris的原始解决方案的两倍,在@Dan改进后,速度仍然是原来的1.5倍。

@Dan啊,听起来更好:)更新了帖子