在根据条件提供标签的熊猫数据框中添加列

时间:2019-10-24 16:02:25

标签: pandas dataframe time-series

我有一个填充有时间序列温度数据的数据框,需要根据温度将设备状态标记为“好”或“坏”。如果介于35到45之间,则为“好”,否则为“不良”。但是,我想添加一个条件,如果它在被列为“不良”后返回到适当的温度范围,则必须至少持续两天为“良好”,然后才能再次标记为“良好”。到目前为止,我可以在一个更基本的级别上进行标签,但是要努力实现更复杂的标签开关。

df['status'] = ['bad' if x <35 or x >45 else 'good' for x in df['temp']]

任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:1)

import numpy as np    
df['status'] = np.where((df['temp']>35) | (df['temp']>45) , 'bad', 'good')

这应该可以解决问题。

答案 1 :(得分:1)

这样的方法呢?

您可以为每行设置一个group_check函数,并从更大的df检查该行中组内是否有相邻的有害温度。

这只会检查以前的测量值。您需要对当前测量值进行快速布尔检查,以确认先前的测量值是正确的并且当前测量值是正确的。

def group_check_maker(index, row):
    def group_check(group):
        if len(group) > 1:
          if index in group.index:
            failed_status = False
            for index2, row2 in group.drop(index).iterrows():
              if (row['Date'] > row2['Date']) and (row['Date'] - row2['Date'] < pd.Timedelta(days = 2)) and (row2['Temperature'] < 35 or row2['Temperature'] >45):
                  failed_status = True
            if failed_status:
                return 'Bad'
            else:
                return 'Good'

    return group_check

def row_checker_maker(df):
    def row_checker(row):
        group_check = group_check_maker(row.name, row)
        return df[df['Equipment ID'] == row['Equipment ID']].groupby('Equipment ID').apply(group_check).iloc[0]
    return row_checker

row_checker = row_checker_maker(df)

df['Neighboring Day Status'] = df.apply(row_checker, axis = 1)

答案 2 :(得分:0)

您可以创建一个{'1'}值,并将值where 替换为fillna,将其替换为35和45,然后使用{{将值“ bad”传播到接下来的两个空行1}}和2的限制,最后enter image description here其余的很好,例如:

pd.Series