Замените элемент столбца (если последовательное значение отличается на 10) средним значением верхнего и нижнего значений в пандах - PullRequest
1 голос
/ 20 мая 2019

У меня есть датафрейм, имеющий столбец температуры.В столбце температуры в некоторых строках последовательные значения отличаются более чем на 10, и я хочу очистить свой набор данных.Я хочу заменить это значение на среднее из верхнего и нижнего значений.

Я пробовал какую-то условную замену, но она не работает ...

df.loc[df['Temperature1'] > 50, 'Temperature'] = 23

Я пробовал это, но это будетизмените все элементы выше 50 на 23 .. но я хочу сравнить две строки и проверить разницу, если она больше 10, чем нужно заменить.

1 Ответ

0 голосов
/ 20 мая 2019

РЕДАКТИРОВАТЬ: добавлен пример с скользящее окно (см. Также: оконные функции )


Вы можете использовать shift () , чтобы поместить значения из верхнего ряда и нижнего ряда в средний ряд.

import pandas as pd

df = pd.DataFrame({'Temperature': [10,30,20,40,50]})

df['upper_row'] = df['Temperature'].shift()
df['lower_row'] = df['Temperature'].shift(-1)

print(df)

Результат

   Temperature  upper_row  lower_row
0           10        NaN       30.0
1           30       10.0       20.0
2           20       30.0       40.0
3           40       20.0       50.0
4           50       40.0        NaN

И затем у вас есть три значения в одной строке, и вы можете вычесть их, вычислить среднее значение, сравнить их и т. Д.

df['difference'] = (df['Temperature'] - df['upper_row']).abs()
df['mean'] = (df['upper_row'] + df['lower_row'])/2

print(df)

Результат

   Temperature  upper_row  lower_row  difference  mean
0           10        NaN       30.0         NaN   NaN
1           30       10.0       20.0        20.0  15.0
2           20       30.0       40.0        10.0  35.0
3           40       20.0       50.0        20.0  35.0
4           50       40.0        NaN        10.0   NaN

И вы можете заменить значения в Temperature

df['Temperature'][ df['difference']>10 ] = df['mean']

print(df)

Результат

   Temperature  upper_row  lower_row  difference  mean
0           10        NaN       30.0         NaN   NaN
1           15       10.0       20.0        20.0  15.0
2           20       30.0       40.0        10.0  35.0
3           35       20.0       50.0        20.0  35.0
4           50       40.0        NaN        10.0   NaN

Полный пример:

import pandas as pd

df = pd.DataFrame({'Temperature': [10,30,20,40,50]})

df['upper_row'] = df['Temperature'].shift()
df['lower_row'] = df['Temperature'].shift(-1)
print(df)

df['difference'] = (df['Temperature'] - df['upper_row']).abs()
df['mean'] = (df['upper_row'] + df['lower_row'])/2
print(df)

df['Temperature'][ df['difference']>10 ] = df['mean']
print(df)

РЕДАКТИРОВАТЬ: вы также можете использовать скользящее окно для работы с двумя или тремя последовательными рядами. Смотрите комментарии в коде.

import pandas as pd

df = pd.DataFrame({'Temperature': [10,30,20,40,50]})

# work with two consecutive rows and result assign to last row
rw2 = df['Temperature'].rolling(2)
df['difference'] = rw2.apply(lambda rows:abs(rows[1] - rows[0]), raw=True)

# work with three consecutive rows and result assign to middle/center row
rw3 = df['Temperature'].rolling(3, center=True)
df['mean'] = rw3.apply(lambda rows:(rows[0] + rows[2])/2, raw=True)

print(df)

df['Temperature'][ df['difference']>10 ] = df['mean']
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...