按其他列填写(我不知道如何命名)

2024-06-07 06:19:28 发布

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

我有一个pandas数据框,其中有一列指示帐户的条款是否在某个特定期间发生了更改,值为“Y”。 举个例子:

import pandas as pd
account = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3]
period = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 1, 2, 3]
changed = ["N", "N", "N", "Y", "N", "N", "N", "Y", "N", "N", "N", "N", "N", "N"]

df = pd.DataFrame({'account': account,'period': period,'changed': changed})

print(df)
    account period changed
0    1       1       N
1    1       2       N
2    1       3       N
3    1       4       Y
4    1       5       N
5    1       6       N
6    2       1       N
7    2       2       Y
8    2       3       N
9    2       4       N
10   2       5       N
11   3       1       N
12   3       2       N
13   3       3       N

我想把改变了的列变成一个开关,一旦打开,就为那个帐户保持打开。我还希望将开关转换为0和1,如下所示

有没有一种方法可以做到这一点,而不必循环通过每个帐户。我有数百万个账户

    account period  changed
0    1       1        0
1    1       2        0
2    1       3        0
3    1       4        1
4    1       5        1
5    1       6        1
6    2       1        0
7    2       2        1
8    2       3        1
9    2       4        1
10   2       5        1
11   3       1        0
12   3       2        0
13   3       3        0

Tags: 数据方法importdataframepandasdfas帐户
2条回答

这更像是带有cumsum问题的groupby

(df.changed.eq('Y')).groupby(df['ID']).cumsum().astype(int)
Out[141]: 
0     0
1     0
2     0
3     1
4     1
5     1
6     0
7     1
8     1
9     1
10    1
11    0
12    0
13    0
Name: changed, dtype: int32

您可以使用布尔比较并转换为int。然后使用GroupBy+cummax来识别account历史上发生的变化:

df['changed'] = df['changed'].eq('Y').astype(int)
df['changed'] = df.groupby('account')['changed'].cummax()

print(df)

    account  period  changed
0         1       1        0
1         1       2        0
2         1       3        0
3         1       4        1
4         1       5        1
5         1       6        1
6         2       1        0
7         2       2        1
8         2       3        1
9         2       4        1
10        2       5        1
11        3       1        0
12        3       2        0
13        3       3        0

相关问题 更多 >