熊猫-使用逻辑过滤DataFrame

时间:2019-03-26 12:27:55

标签: python pandas

我有一个这样的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,
})

1 个答案:

答案 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}}