如何在某些大于或小于给定最大值的DataFrame列中查找值,然后将其替换为上一行的值?

时间:2019-02-13 10:51:10

标签: python pandas dataframe

数据帧df的“日期时间”列和“ 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

我正在考虑的功能是:

  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)

1 个答案:

答案 0 :(得分:2)

您可以先检测每列中的离群值。这是一种方法:

var headers = req.getResponseHeader('library').toLowerCase();

然后使用布尔索引并同时使用ffill()bfill来确保您填写所有缺少的值:

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