【问题标题】:Pandas : Replace values multiple times until the endPandas:多次替换值直到结束
【发布时间】:2018-05-17 16:39:39
【问题描述】:

我有一个这样的熊猫 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

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

想要的结果应该是这样的:

【问题讨论】:

    标签: python pandas replace series shift


    【解决方案1】:

    您可以按条件将值替换为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 = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8400 ]})
    • 所以我认为如果cumulative data 是不可能的。请给我一些时间。
    • 一个问题,你需要将掩码的第一个Trues 替换到DataFrame 的末尾吗?
    • yes ......因为这个错误只出现在系列的末尾(但值很奇怪。)
    【解决方案2】:

    这个怎么样?

    df.loc[df['sales'] > 200] = 10
    

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多