gpt4 book ai didi

python - Pandas : Replace values multiple times until the end

转载 作者:行者123 更新时间:2023-11-30 22:25:06 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com