代码之家  ›  专栏  ›  技术社区  ›  DeeeeRoy

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

  •  2
  • DeeeeRoy  · 技术社区  · 7 年前

    我有一个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 回复  |  直到 7 年前
        1
  •  1
  •   BENY    7 年前

    这更像是一个 groupby cumsum 问题

    (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
    
        2
  •  0
  •   jpp    7 年前

    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