熊猫:多次替换值直到结束

时间:2017-12-04 08:50:59

标签: python pandas replace series shift

我有一只像这样的熊猫:

import pandas as pd
df = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8666]})

enter image description here

这是来自销售的累积数据。 数据中存在一个错误:有些观察结果是错误的。 (没有值可以大于前一个:即8500和8666不正确) 我想用前一个替换这些值。

我试过这个

df['above'] = df.sales.shift(1)
df.loc[df.above < df.sales, 'sales'] = df.above

但是这段代码只运行一次,如何扩展这段代码来替换所有值,直到系列结束(前一个)?

所需的结果如下:

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以按条件将值替换为NaN,然后将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相同,默认情况下替换为NaN,如果始终为整数值,则最后转换为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

答案 1 :(得分:0)

这个怎么样?

SolidColorBrush Owncolor = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FF5D0000"));
ToggleButton.Foreground = Brushes.Owncolor; 

参考:https://stackoverflow.com/a/38467449/4772042

'200'是我抓住的正确值。将其更改为所需的值。