python pandas中的条件填充逻辑

时间:2019-08-06 19:29:56

标签: python pandas

我有一个pandas数据框,并且创建了一个遮罩,该遮罩将一系列筛选为特定的操作类型。最终,我将按汇总进行分组,但在此之前,我需要对数据进行质量控制,以便将分组正确分组。所以我遇到的问题是我的操作类别有一些我需要更改的随机空值,所以我需要做的是检查上一个和下一个操作,然后如果两者相同,则需要更改当前操作该操作类型的节点。

注意:这是一个时间序列数据帧

由于最终数据集可能很大,我正在尝试优化此方法的时间。我尝试了apply和lambda函数,但它们无法正常运行。...可能是用户错误。

def prep_rot_data(ops_rot_cur, ops_rot_lag, ops_rot_lead):
    # psuedo code
    '''
        if ops_rot_cur == rotate then return 'rotate'
        elif ops_rot_cur == None and ops_rot_lag == 'rotate' and ops_rot_lead == 'rotate' then return 'rotate'
    '''
    if 'rotate' in ops_rot_cur :
        return 'rotate'
    elif 'na' in ops_rot_cur and 'rotate' in ops_rot_lag and 'rotate' in ops_rot_lead:
        return 'rotate'

  c_df['rig_ops_rot'] = np.where(c_df['operation'] == 'Rotary Drill','rotate', None)              # rotate ops mask
            #c_df['rig_ops_rot_test'] = c_df.apply(lambda x: prep_rot_data(x['rig_ops_rot'], x['rig_ops_rot'].shift(1), x['rig_ops_rot'].shift(-1)), axis=1)

我不确定计算多条件签入熊猫的最有效方法是什么,因此可能会有更有效的方法来执行此操作。我希望该操作在解释正确结果之前先检查滞后节点和超前节点

1 个答案:

答案 0 :(得分:0)

您想要的输出不够清晰,但是可以使用pandas.DataFrame对象处理多个条件,如您的伪代码所建议的

'''
    if ops_rot_cur == rotate then return 'rotate'
    elif ops_rot_cur == None and ops_rot_lag == 'rotate' and ops_rot_lead == 'rotate' then return 'rotate'
'''

您可以尝试以下操作,假设您的df my_df 包含ops_rot_cur,ops_rot_lag和ops_rot_lead列;

my_df['rig_ops_rot'] = ''
cond1 = my_df['ops_rot_cur'].str.contains('rotate')
cond2 = (my_df['ops_rot_cur'].isna())&(my_df['ops_rot_lag'].str.contains('rotate'))&\
        (my_df['ops_rot_lead'].str.contains('rotate'))
my_df[cond1] = 'rotate'
my_df[cond2] = 'rotate'

,或者

def get_rig_ops_rot(row):
    if 'rotate' in row['ops_rot_cur']:
        row['rig_ops_rot'] = 'rotate'
    elif 'na' in row['ops_rot_cur'] and 'rotate' in row['ops_rot_lag'] and 'rotate' in row['ops_rot_lead']:
        row['rig_ops_rot'] = 'rotate'
    return row

my_df = my_df.apply(get_rig_ops_rot, axis=1)