Как найти значения в определенных столбцах DataFrame, которые больше / меньше заданного максимума, а затем заменить их значениями предыдущей строки? - PullRequest
0 голосов
/ 13 февраля 2019

Датафрейм df имеет столбцы «Datetime» и «A», «B», «C», которые содержат некоторые температуры в качестве значений с плавающей запятой:

abctemps = {"Datetime": ["2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05"],
            "A": [1.0,4.5,8.0,11.1,100.2],
            "B": [-5.0,-18.1,-7.3,-5000.3,-21.5],
            "C": [4,87,3.0,7,81]}
df = pd.DataFrame(abctemps)
df

    Datetime    A        B      C
0   2018-01-01  1.0     -5.0    4.0
1   2018-01-02  4.5     -18.1   87.0
2   2018-01-03  8.0     -7.3    3.0
3   2018-01-04  11.1    -5000.3 7.0
4   2018-01-05  100.2   -21.5   81.0

Столбцы A, B и C содержат температуры, но некоторые значения явно слишком большие (или маленькие) , чтобы быть правдой (100.2, -5000.3, 87, 81), , поэтому я хочу заменить их на предыдущее (или следующий, если предыдущий не существует?) значение в том же столбце .Так, например, в столбце A 100.2 будет заменено на 11.1.Или в столбце B: -5000,3 с -7,3.

Желаемый результат будет выглядеть следующим образом:

    Datetime    A        B      C
0   2018-01-01  1.0     -5.0    4.0
1   2018-01-02  4.5     -18.1   4.0
2   2018-01-03  8.0     -7.3    3.0
3   2018-01-04  11.1    -7.3    7.0
4   2018-01-05  11.1    -21.5   7.0

Я имею в виду функцию, которая:

  1. фильтрует, чтобы показать только строки в данном столбце, где значение больше, чем, например, 40,

  2. захватывает строку .loc

  3. на основе этого .loc, получает значение предыдущей строки в том же столбце

  4. заменяет неверное значение значением предыдущей строки

Как бы я это сделал, или есть другой способ, который лучше?.loc хорошо для этого?Спасибо за любую помощь.

редактировать: я смог сделать функцию, которая делает это:

def longtozero(col, length):
    try:
        df.loc[df[col].str.len() > length, col] = df.loc[df.loc[df[col].str.len() > length, col].index[0]-1, col]
        df[col] = df[col].astype('float64')
    except:
        pass

Затем вызвать функцию со столбцом и нужныммаксимальная длина, например:

longtozero("A", 3)

1 Ответ

0 голосов
/ 13 февраля 2019

Вы можете начать с обнаружения выбросов в каждом столбце.Вот способ сделать это:

m = df.loc[:,:'C'].apply(lambda x: np.abs(x-x.mean()) <= (x.std()), axis=0)

     A      B      C
0   True   True   True
1   True   True  False
2   True   True   True
3   True  False   True
4  False   True  False

А затем используйте логическое индексирование и используйте ffill() и bfill, чтобы убедиться, что вы заполните все пропущенныезначения:

df.loc[:,:'C'] = df.loc[:,:'C'].where(m).ffill().bfill()

     A     B    C    Datetime
0   1.0  -5.0  4.0  2018-01-01
1   4.5 -18.1  4.0  2018-01-02
2   8.0  -7.3  3.0  2018-01-03
3  11.1  -7.3  7.0  2018-01-04
4  11.1 -21.5  7.0  2018-01-05
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...