我有一个这样的Pandas DataFrame,
Employee ID ActionCode ActionReason ConcatenatedOutput
1 TER DEA TER_DEA
1 RET ABC RET_ABC
1 RET DEF RET_DEF
2 TER DEA TER_DEA
2 ABC ABC ABC_ABC
2 DEF DEF DEF_DEF
3 RET FGH RET_FGH
3 RET EFG RET_EFG
4 PLA ABC PLA_ABC
4 TER DEA TER_DEA
我想用以下逻辑对其进行过滤,并将其更改为类似的内容,
Employee ID ConcatenatedOutput Context
1 RET_ABC RET or TER Found
2 TER_DEA RET or TER Found
3 RET_FGH RET or TER Found
4 PLA_ABC RET or TER Not Found
逻辑:- 1)如果某个雇员的第一条记录是TER_DEA,那么我们进入该雇员,看看该雇员是否还有其他记录;如果该雇员还有另一条RET记录,那么我们将选择第一个可用的RET记录,否则我们坚持TER_DEA记录。
2)如果员工的第一条记录不是TER_DEA,则我们将保留该记录。
3)上下文是有条件的,如果它具有RET或TER,那么我们说找到RET或TER,否则找不到它。
注意:-最终输出中只有一个记录是员工ID。
下面的数据
employee_id = [1,1,1,2,2,2,3,3,4,4]
action_code = ['TER','RET','RET','TER','ABC','DEF','RET','RET','PLA','TER']
action_reason = ['DEA','ABC','DEF','DEA','ABC','DEF','FGH','EFG','ABC','DEA']
concatenated_output = ['TER_DEA', 'RET_ABC', 'RET_DEF', 'TER_DEA', 'ABC_ABC', 'DEF_DEF', 'RET_FGH', 'RET_EFG', 'PLA_ABC', 'TER_DEA']
df = pd.DataFrame({
'Employee ID': employee_id,
'ActionCode': action_code,
'ActionReason': action_reason,
'ConcatenatedOutput': concatenated_output,
})
答案 0 :(得分:1)
我建议您宁可在该领域选择布尔。为了获得测试数据,我使用了以下方法:
def myfunc(data):
if data.iloc[0]['ConcatenatedOutput'] == 'TER_DEA':
if len(data.loc[data['ActionCode'] == 'RET']) > 0:
located_record = data.loc[data['ActionCode'] == 'RET'].iloc[[0]]
else:
located_record = data.iloc[[0]]
else:
located_record = data.iloc[[0]]
located_record['RET or TER Context'] = data['ActionCode'].str.contains('|'.join(['RET', 'TER']))
return located_record
df.groupby(['Employee ID']).apply(myfunc)
然后您可以按员工ID进行分组,并在其中应用功能以执行您的特定程序逻辑。
{{1}}