Pandas :多次替换值直到结束

Pandas : Replace values multiple times until the end

我有一个 pandas 像这样的 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

但是这段代码只能工作一次,如何扩展这段代码以替换所有值直到系列结束(与前一个)?

所需的结果应如下所示:

您可以按条件将值替换为 NaNs,然后使用 ffill - fillnamethod='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 的相同之处在于,默认情况下替换为 NaNs,最后转换为 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' 是我抓到的正确值。将其更改为所需的值。