Датафрейм 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
Я имею в виду функцию, которая:
фильтрует, чтобы показать только строки в данном столбце, где значение больше, чем, например, 40,
захватывает строку .loc
на основе этого .loc
, получает значение предыдущей строки в том же столбце
заменяет неверное значение значением предыдущей строки
Как бы я это сделал, или есть другой способ, который лучше?.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)