首页 > 解决方案 > 如何在某些 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],
            "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),所以我想用前一个替换它们(或者下一个,以防前一个没有) t 存在吗?)在同一列中的值。因此,例如在 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

我正在考虑一个函数:

  1. 过滤器以仅显示给定列中值大于例如 40 的行,

  2. 抓住那一排的.loc

  3. 基于此.loc,在同一列中获取上一行的值

  4. 用前一行的值替换坏值

我该怎么做,或者有其他更好的方法吗?.loc对这个有好处吗?感谢您的任何帮助。

编辑:我能够做到这一点的功能:

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)

标签: pythonpandasdataframe

解决方案


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

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

然后使用布尔索引并使用两者ffill()bfill确保填充所有缺失值:

df.loc[:,:'C'] = df.loc[:,:'C'].where(m).ffill().bfill()

     A     B    C    Datetime
0   1.0  -5.0  4.0  2018-01-01
1   4.5 -18.1  4.0  2018-01-02
2   8.0  -7.3  3.0  2018-01-03
3  11.1  -7.3  7.0  2018-01-04
4  11.1 -21.5  7.0  2018-01-05

推荐阅读