【问题标题】:Pandas filldown by other column (I don't know how to name this)Pandas 按其他列填写(我不知道如何命名)
【发布时间】:2019-03-16 21:46:38
【问题描述】:

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

【问题讨论】:

    标签: python pandas dataframe apply pandas-groupby


    【解决方案1】:

    这更像是groupbycumsum 的问题

    (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
    

    【讨论】:

    • 抱歉,我重新标记了我的列。你太快了,你已经回答了。谢谢!您的解决方案有效! df['changed'] = (df.changed.eq('Y')).groupby(df['account']).cumsum().astype(int)
    • 只要确保一组没有 2 个 'Y' 值,否则您最终会得到大于 1 的数字!
    【解决方案2】:

    您可以使用布尔比较并转换为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
    

    【讨论】:

    • 这里的“ID”是什么?
    • ID 现在是帐户。 df['changed'] = (df['changed'].eq('Y')).astype(int) df['changed'] = df.groupby('account').cummax() 这样出来帐户期间更改 0 1 1 1 1 1 2 2 2 1 3 3 3 1 4 4 4 1 5 5 5 1 6 6 6 2 1 1 7 2 2 2 8 2 3 3 9 2 4 4 10 2 5 5 11 3 1 1 12 3 2 2 13 3 3 3
    • KeyError: 'ID'熊猫0.20
    • 我想知道为什么cummax 会随着accountchanged 而变化,而不是依赖于period。当account摸索时changedperiods不是都分组了吗?
    • @astro123,请参阅更新。不知道发生了什么。我认为您更改列标签时有些混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多