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)
我想创建一个新列“检查”,该列将基于数据框中前一行中的数据:
输出:
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 条件,但它对我不起作用。你能帮忙吗?
考虑一个更复杂的示例数据框来进行说明:
# 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)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |