Условно замените значения в pandas.DataFrame на предыдущее значение - PullRequest
0 голосов
/ 13 октября 2018

Мне нужно отфильтровать выбросы в наборе данных.Замена выброса на предыдущее значение в столбце имеет наибольшее значение для моего приложения.

У меня были значительные трудности с этим при использовании доступных инструментов pandas (в основном для копирования на слайсы или преобразования типов).происходит при установке на NaN).

Существует ли быстрый и / или эффективный способ памяти?(Пожалуйста, смотрите мой ответ ниже для решения, которое я использую в настоящее время, которое также имеет ограничения.)


Простой пример:

>>> import pandas as pd
>>> df = pd.DataFrame({'A':[1,2,3,4,1000,6,7,8],'B':list('abcdefgh')})
>>> df
      A  B
0     1  a
1     2  b
2     3  c
3     4  d
4  1000  e # '1000  e' --> '4  e'
5     6  f
6     7  g
7     8  h

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вы можете просто замаскировать значения сверх вашего порога и использовать ffill:

df.assign(A=df.A.mask(df.A.gt(10)).ffill())

     A  B
0  1.0  a
1  2.0  b
2  3.0  c
3  4.0  d
4  4.0  e
5  6.0  f
6  7.0  g
7  8.0  h

Использование mask необходимо, а не что-то вроде shift, потому чтоэто гарантирует выходной сигнал не в том случае, если предыдущее значение также превышает пороговое значение.

0 голосов
/ 13 октября 2018

Я обошел некоторые проблемы с pandas копиями и срезами, сначала преобразовав в массив numpy, выполнив там операции, а затем заново вставив столбец.Я не уверен, но, насколько я могу судить, тип данных остается прежним, когда он возвращается в pandas.DataFrame.

def df_replace_with_previous(df,col,maskfunc,inplace=False):
    arr = np.array(df[col])
    mask = maskfunc(arr)
    arr[ mask ] = arr[ list(mask)[1:]+[False] ]
    if inplace:
        df[col] = arr
        return
    else:
        df2 = df.copy()
        df2[col] = arr
        return df2

. Это создает маску, сдвигает ее на единицу, так чточто значения True указывают на предыдущую запись и обновляют массив.Конечно, это нужно будет выполнять рекурсивно, если есть несколько смежных выбросов (N раз, если есть N последовательных выбросов), что не идеально.

Использование в случае, указанном в OP:

df_replace_with_previous(df,'A',lambda x:x>10,False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...