【问题标题】:Calculate mean of df, BUT if =>1 of the values differs >20% from this mean, the mean is set to NaN计算 df 的平均值,但如果 =>1 的值与该平均值相差 >20%,则平均值设置为 NaN
【发布时间】:2020-09-18 03:25:00
【问题描述】:

我想计算数据帧的 a、b、c、d 列的平均值,但如果每个数据帧行中的四个值之一与这个平均值(四个值中的)相差超过 20%,则平均值必须设置为 NaN。

计算 4 列的平均值很容易,但我坚持定义条件“如果平均值*0.8

在示例中,ID:5 和 ID:87 中的一个或多个值不适合区间,因此均值设置为 NaN。 (在计算平均值和将 20% 条件应用于计算的平均值时,初始数据帧中的 NaN 值将被忽略)

所以我试图只计算没有“异常值”的数据行的平均值。

初始df:

 ID   a    b    c   d
  2  31   32   31  31
  5  33   52  159   2
  7  51  NaN   52  51 
 87  30   52  421   2
 90  10   11   10  11
102  41   42  NaN  42

所需的df:

 ID   a    b    c   d    mean
  2  31   32   31  31   31.25
  5  33   52  159   2     NaN
  7  51  NaN   52  51   51.33
 87  30   52  421   2     NaN
 90  10   11   10  11   10.50
102  41   42  NaN  42   41.67

代码:

import pandas as pd

import numpy as np



df = pd.DataFrame({"ID": [2,5,7,87,90,102],
    
                    "a": [31,33,51,30,10,41],
     
                    "b": [32,52,np.nan,52,11,42],
      
                    "c": [31,159,52,421,10,np.nan],
  
                    "d": [31,2,51,2,11,42]})


print(df)



a = df.loc[:, ['a','b','c','d']]


df['mean'] = (a.iloc[:,0:]).mean(1)


print(df)


b = df.mean.values[:,None]*0.8 < a.values[:,:] < df.mean.values[:,None]*1.2
print(b)
...


【问题讨论】:

    标签: python pandas nan mean


    【解决方案1】:

    试试这个:

    # extract related information
    s = df.iloc[:,1:]
    
    # calculate mean
    mean = s.mean(1)
    
    # where condition is violated    
    mask = s.lt(mean*.8, axis=0) | s.gt(mean*1.2, axis=0)
    
    # mask where mask is True on any row
    df['mean'] = mean.mask(mask.any(1))
    

    输出:

        ID   a     b      c   d       mean
    0    2  31  32.0   31.0  31  31.250000
    1    5  33  52.0  159.0   2        NaN
    2    7  51   NaN   52.0  51  51.333333
    3   87  30  52.0  421.0   2        NaN
    4   90  10  11.0   10.0  11  10.500000
    5  102  41  42.0    NaN  42  41.666667
    

    【讨论】:

    • 做均值和比较,一个问题是均值都准备好考虑异常值,您可能需要使用比较进行滚动均值
    • @YOBEN_S:采用滚动平均值是一个有趣的建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-11-03
    • 2017-02-06
    • 2012-06-19
    • 2020-04-25
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多