将值应用于数据帧而不使用forloop

2024-04-26 23:25:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种更快的方法,将值应用于数据帧中的列。该值基于第一列和第二列中的两个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函数,但我不确定)。
有什么想法吗?你知道吗


Tags: and数据方法falsetruedffor数字
2条回答

您希望使用前一行的值来迭代数据帧。在这种情况下,最有效的方法是直接迭代底层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倍。你知道吗

使用pandas.DataFrame.groupby.cumsum

import pandas as pd

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

或者@丹的建议:

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

相关问题 更多 >