我有一个带有列的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
答案 0 :(得分:1)
这更像是eachart
问题groupby
cumsum
答案 1 :(得分:0)
您可以使用布尔比较并转换为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