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