Панды: заменить значения несколько раз до конца

У меня есть панды 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

ссылка: /questions/31071204/ustanovit-znachenie-dlya-konkretnoj-yachejki-v-pande-dataframe-ispolzuya-indeks/31071208#31071208

"200" - это правильное значение, которое я поймал. Измените его на желаемое значение.

Другие вопросы по тегам