【问题标题】:Replace value in a pandas dataframe column by the previous one用前一个替换熊猫数据框列中的值
【发布时间】:2017-11-01 03:24:58
【问题描述】:

我的代码检测时间序列中的异常值。我想要做的是将第一个数据框列中的异常值替换为之前不是异常值的值。

这段代码只是检测异常值,创建一个布尔数组,其中:

  • True 表示数据框中的值是异常值
  • False 表示数据框中的值不是异常值
series = read_csv('horario_completo.csv', header=None,  squeeze=True)
df=pd.DataFrame(series)
from pandas import rolling_median

consumos=df.iloc[:,0]
df['rolling_median'] = rolling_median(consumos, window=48, center=True).fillna(method='bfill').fillna(method='ffill')
threshold =50
difference = np.abs(consumos - df['rolling_median'])
outlier = difference > threshold

到目前为止,一切正常。

我想到的下一步是创建一个掩码,将Truevalues 替换为同一列的前一个值(如果可以的话,它会比循环快得多)。

我将尝试用一个小例子来解释它:

这就是我所拥有的:

index consumo

  0      54
  1      67
  2      98


index outlier 

  0    False
  1    False
  2    True

这就是我想做的:

index consumo

  0     54
  1     67
  2     67

我想我应该像这样创建一个面具:

df.mask(outlier, df.columns=[[0]][i-1],axis=1)

显然这不是写它的方式。这只是关于我认为可以如何完成的解释(我说的是 [i-1])。

【问题讨论】:

    标签: python pandas dataframe series outliers


    【解决方案1】:

    看来你需要shift:

    consumo = consumo.mask(outlier, consumo.shift())
    print (consumo)
    0    54.0
    1    67.0
    2    67.0
    Name: consumo, dtype: float64
    

    如果所有值都是ints,则最后一个添加astype

    consumo = consumo.mask(outlier, consumo.shift()).astype(int)
    print (consumo)
    0    54
    1    67
    2    67
    Name: consumo, dtype: int32
    

    【讨论】:

    • 我不知道 shift() 的存在。它真的非常有用。你的答案很清楚,而且效果很好。非常感谢。
    • 很高兴能帮上忙,美好的一天!
    猜你喜欢
    • 2018-08-16
    • 2015-01-19
    • 2022-01-11
    • 2023-04-03
    • 2022-06-24
    相关资源
    最近更新 更多