Панды: заменить значения несколько раз до конца
У меня есть панды DF, как это:
import pandas as pd
df = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8666]})
Это совокупные данные от продаж. В данных есть ошибка: некоторые наблюдения неверны. (Никакое значение не может быть больше предыдущего: т.е. 8500 и 8666 не верны). Я хочу заменить эти значения на предыдущее.
Я пробовал это
df['above'] = df.sales.shift(1)
df.loc[df.above < df.sales, 'sales'] = df.above
Но этот код работает только один раз, как расширить этот код, чтобы заменить все значения до конца ряда (с предыдущим)?
Желаемый результат должен выглядеть так:
2 ответа
Вы можете заменить значения на NaN
с условием, а затем использовать ffill
- fillna
с method='ffill'
:
df.loc[df.above < df.sales, 'sales'] = np.nan
df['sales'] = df['sales'].ffill()
print (df)
sales above
0 114.0 NaN
1 114.0 114.0
2 114.0 114.0
3 113.0 114.0
4 12.0 113.0
5 10.0 12.0
6 10.0 10.0
7 10.0 8500.0
Что такое же, как использование mask
, которые по умолчанию заменяют на NaN
s, последний актерский состав int
если всегда целочисленные значения:
df = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8666]})
df['sales'] = df['sales'].mask(df.sales.shift(1) < df.sales).ffill().astype(int)
print (df)
sales
0 114
1 114
2 114
3 113
4 12
5 10
6 10
7 10
РЕДАКТИРОВАТЬ:
df = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8400]})
df['sales'] = df['sales'].mask((df.sales.shift(1) < df.sales).cumsum() > 0).ffill().astype(int)
print (df)
sales
0 114
1 114
2 114
3 113
4 12
5 10
6 10
7 10
Деталь:
print ((df.sales.shift(1) < df.sales).cumsum())
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
Name: sales, dtype: int32
print ((df.sales.shift(1) < df.sales).cumsum() > 0)
0 False
1 False
2 False
3 False
4 False
5 False
6 True
7 True
Name: sales, dtype: bool
Как насчет этого?
df.loc[df['sales'] > 200] = 10
"200" - это правильное значение, которое я поймал. Измените его на желаемое значение.