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

标签 python pandas dataframe if-statement

我有一个下面的数据框

         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/

    相关文章:

    python - Django:使用参数重定向到 View

    python - 在 pandas 中使用正则表达式验证字符串

    python - 将 defaultdict 传递给 df

    python - Pandas 对两个数字之间的列的操作

    r - 通过匹配列和值 R 对数据帧进行子集和分组

    Python - 从多个文件的多个字符串中提取文本

    python - 收集静态后,使用 python manage.py runserver 缺少 Django admin CSS

    python - 当存在 NaN 并且您想使用 groupby 时

    python - 循环根据多列条件过滤行 pandas python

    python - 转换 hh :mm:ss to minutes using python pandas