python - Pandas : Replace values multiple times until the end

标签 python pandas replace series shift

我有一个像这样的 pandas df:

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

最佳答案

您可以按条件将值替换为 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

关于python - Pandas : Replace values multiple times until the end,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47629563/

相关文章:

python - 当作为参数传递给函数时,哪些值会导致使用默认值?

python - 使用正则表达式(python)将一个数字分成 2 或 3 个 block

python - 用python对数值系列进行分类

python - 如何在另一个搜索词中搜索和替换一个词

bash - 用 || 替换新行

python - 关联表的列到行

python - 我想使用 Python 打开一个空白窗口,而不使用 Tkinter 或等效的 API。我怎么能这么做呢?

python - 使用 pandas 查找时间序列数据中缺失的分钟数据

python - 根据 bool 条件在新列中设置值

search - 在 vim 中用另一行代码替换一行代码?