基于前一行的熊猫数据框列

joh*_*hnt 5 python if-statement dataframe pandas

我有一个下面的数据框

         id  action   
         ================
         10   CREATED   
         10   111
         10   222
         10   333
         10   DONE      
         10   222
         10   UPDATED   
         777  CREATED    
         10   333
         10   DONE      
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列“检查”,该列将基于数据框中前一行中的数据:

  1. 在操作列中查找单元格 =“完成”
  2. 在 DONE 之前,在前面的行中搜索第一个具有相同 ID 的 CREATED 或 UPDATED。如果它是 CREATED 然后把 C 放在 UPDATED 把 U 的情况下。

输出:

         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
Run Code Online (Sandbox Code Playgroud)

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

Shu*_*rma 1

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

# 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     
Run Code Online (Sandbox Code Playgroud)

使用:

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'] = ''
Run Code Online (Sandbox Code Playgroud)

解释:

首先,我们对数据帧进行分组id并应用一个grouper函数,然后对于每个分组的数据帧,我们根据操作列中第一次出现的情况进一步对该分组的数据帧进行分组DONE,因此本质上我们将此分组的数据帧拆分为多个部分,其中每个部分彼此分开通过DONE操作列中的值。然后我们使用lambda 函数根据操作列中值之前的第一个值(或)transformer来转换每个分割的数据帧。CREATEDUPDATEDDONE

结果:

# 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
Run Code Online (Sandbox Code Playgroud)