熊猫按其他列填充(我不知道如何命名)

时间:2018-10-11 18:00:50

标签: python pandas dataframe apply pandas-groupby

我有一个带有列的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

2 个答案:

答案 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