Python 按其他列填写(我不知道如何命名)
我有一个pandas数据框,其中有一列指示账户的条款是否在特定时期内发生了变化,值为“Y”。 以下是一个例子: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"
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 3KeyError:“ID”
pandas 0.20我想知道为什么cummax
会随着帐户和的变化而变化,而不依赖于期间。当通过帐户进行摸索时,是否已更改,期间是否已分组?@astro123,请参阅更新。不知道发生了什么。我认为在您更改列标签时出现了一些混乱。