gpt4 book ai didi

python - 基于前一行的 Pandas 数据框列

转载 作者:行者123 更新时间:2023-12-03 17:11:34 25 4
gpt4 key购买 nike

我有一个下面的数据框

         id  action   
================
10 CREATED
10 111
10 222
10 333
10 DONE
10 222
10 UPDATED
777 CREATED
10 333
10 DONE

我想创建一个新列“检查”,该列将基于数据框中前一行中的数据:
  • 在操作列中查找单元格 =“完成”
  • 在 DONE 之前,在前面的行中搜索第一个具有相同 ID 的 CREATED 或 UPDATED。如果是 CREATED,则将 C 放在 UPDATED 中。

  • 输出:
             id  action   check
    ================
    10 CREATED
    10 111
    10 222
    10 333
    10 DONE C
    10 222
    10 UPDATED
    777 CREATED
    10 333
    10 DONE U

    我尝试使用多个 if 条件,但它对我不起作用。你能帮忙吗?

    最佳答案

    考虑一个更复杂的示例数据框来说明:

    # print(df)
    id action
    10 CREATED
    10 111
    10 222
    10 333
    10 DONE
    10 222
    10 UPDATED
    777 CREATED
    10 333
    10 DONE
    777 DONE
    10 CREATED
    10 DONE
    11 UPDATED
    11 DONE

    用:
    transformer = lambda s: s[(s.eq('CREATED') | s.eq('UPDATED')).cumsum().idxmax()]

    grouper = (
    lambda g: g.groupby(
    g['action'].eq('DONE').cumsum().shift().fillna(0))['action']
    .transform(transformer)
    )

    df['check'] = df.groupby('id').apply(grouper).droplevel(0).str[0]
    df.loc[df['action'].ne('DONE'), 'check'] = ''

    解释:

    首先我们在 id 上对数据框进行分组并申请 grouper函数,然后对于每个分组的数据帧,我们通过第一次出现 DONE 进一步分组这个分组的数据帧在操作列中,因此基本上我们将这个分组的数据帧分成多个部分,其中每个部分通过 DONE 彼此分隔。操作列中的值。然后我们使用 transformer lambda 函数根据 CREATED 之前的第一个值( UPDATEDDONE )转换每个拆分的数据帧操作列中的值。

    结果:
    # print(df)
    id action check
    0 10 CREATED
    1 10 111
    2 10 222
    3 10 333
    4 10 DONE C
    5 10 222
    6 10 UPDATED
    7 777 CREATED
    8 10 333
    9 10 DONE U
    10 777 DONE C
    11 10 CREATED
    12 10 DONE C
    13 11 UPDATED
    14 11 DONE U

    关于python - 基于前一行的 Pandas 数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62348643/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com