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

Python 按其他列填写(我不知道如何命名),python,pandas,dataframe,apply,pandas-groupby,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"

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

这更像是带有
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
识别
账户历史上发生的变更:

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

很抱歉,我重新标记了我的专栏。你太快了,已经回答了。谢谢你的解决方案有效!df['changed']=(df.changed.eq('Y')).groupby(df['account']).cumsum().astype(int)只需确保一个组中没有2个
'Y'
值,否则您将得到大于1的数字!这里的“ID”是什么?ID现在是帐户。df['changed']=(df['changed'].eq('Y')).astype(int)df['changed']=df.groupby('account').cummax()这是由于会计期间发生了变化0 1 1 1 1 2 2 1 3 3 3 1 4 4 1 5 5 1 6 6 2 1 1 7 2 2 8 2 3 9 2 4 102 5 5 11 3 1 12 3 2 13 3 3 3
KeyError:“ID”
pandas 0.20我想知道为什么
cummax
会随着
帐户和
的变化而变化,而不依赖于
期间
。当通过
帐户进行摸索时,
是否已更改
期间是否已分组?@astro123,请参阅更新。不知道发生了什么。我认为在您更改列标签时出现了一些混乱。