我有一个下面的数据框
id action
================
10 CREATED
10 111
10 222
10 333
10 DONE
10 222
10 UPDATED
777 CREATED
10 333
10 DONE
我想创建一个新列“检查”,该列将基于数据框中前一行中的数据:
输出:
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
之前的第一个值( UPDATED
或 DONE
)转换每个拆分的数据帧操作列中的值。结果:
# 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/