Python 如何在某些数据帧列中查找大于/小于给定最大值的值,然后将其替换为前一行';s的价值观?

Python 如何在某些数据帧列中查找大于/小于给定最大值的值,然后将其替换为前一行';s的价值观?,python,pandas,dataframe,Python,Pandas,Dataframe,Dataframe df有“Datetime”和“A”、“B”、“C”列,其中包含一些作为浮点值的温度: abctemps = {"Datetime": ["2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05"], "A": [1.0,4.5,8.0,11.1,100.2], "B": [-5.0,-18.1,-7.3,-5000.3,-21.5],

Dataframe df有“Datetime”和“A”、“B”、“C”列,其中包含一些作为浮点值的温度:

abctemps = {"Datetime": ["2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05"],
            "A": [1.0,4.5,8.0,11.1,100.2],
            "B": [-5.0,-18.1,-7.3,-5000.3,-21.5],
            "C": [4,87,3.0,7,81]}
df = pd.DataFrame(abctemps)
df

    Datetime    A        B      C
0   2018-01-01  1.0     -5.0    4.0
1   2018-01-02  4.5     -18.1   87.0
2   2018-01-03  8.0     -7.3    3.0
3   2018-01-04  11.1    -5000.3 7.0
4   2018-01-05  100.2   -21.5   81.0
列A、B和C包含温度,但某些值明显太大(或太小)不真实(100.2,-5000.3,87,81),因此我想用前一个值替换它们(或者下一个值,如果前一个值不存在的话?同一列中的。例如,在A列中,100.2将替换为11.1。或在B列中,-5000.3和-7.3

所需的输出如下所示:

    Datetime    A        B      C
0   2018-01-01  1.0     -5.0    4.0
1   2018-01-02  4.5     -18.1   4.0
2   2018-01-03  8.0     -7.3    3.0
3   2018-01-04  11.1    -7.3    7.0
4   2018-01-05  11.1    -21.5   7.0
def longtozero(col, length):
    try:
        df.loc[df[col].str.len() > length, col] = df.loc[df.loc[df[col].str.len() > length, col].index[0]-1, col]
        df[col] = df[col].astype('float64')
    except:
        pass
我正在考虑一个函数:

  • 筛选以仅显示给定列中值大于例如40的行

  • 抓住该行的
    .loc

  • 基于该
    .loc
    ,获取同一列中前一行的值

  • 用前一行的值替换坏值

  • 我该怎么做,还是有其他更好的方法?
    .loc
    对这有好处吗?谢谢你的帮助

    编辑:我能够制作一个函数来完成这项工作:

        Datetime    A        B      C
    0   2018-01-01  1.0     -5.0    4.0
    1   2018-01-02  4.5     -18.1   4.0
    2   2018-01-03  8.0     -7.3    3.0
    3   2018-01-04  11.1    -7.3    7.0
    4   2018-01-05  11.1    -21.5   7.0
    
    def longtozero(col, length):
        try:
            df.loc[df[col].str.len() > length, col] = df.loc[df.loc[df[col].str.len() > length, col].index[0]-1, col]
            df[col] = df[col].astype('float64')
        except:
            pass
    
    然后使用列和所需的最大长度调用函数,例如:

    longtozero("A", 3)
    

    您可以从检测每列中的异常值开始。以下是一种方法:

    m = df.loc[:,:'C'].apply(lambda x: np.abs(x-x.mean()) <= (x.std()), axis=0)
    
         A      B      C
    0   True   True   True
    1   True   True  False
    2   True   True   True
    3   True  False   True
    4  False   True  False
    

    如果我复制粘贴第一行(m=df.loc[:,:'C'].apply(lambda x:abs(x)df
    df.loc[:,:'C']
    进行切片的方式是假设datetime列位于末尾。正如您在使用df.loc[:,“A:“C”]时共享数据一样。在我给出的示例中,“datetime”“column是第一列,不是结尾?但它与“A”配合使用:“C”非常感谢您的帮助!如果有人想分享其他方法来做同样的事情,我也会感兴趣。这个解决方案中的(.abs、.std、.ffill和.bfill对我来说是全新的,我也很好奇是否可以用更多的“basic”来完成。”方法,如筛选和.loc)