python - 计算 df 的平均值,但如果 =>1 个值与该平均值相差 >20%,则平均值设置为 NaN

标签 python pandas nan mean

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

计算 4 列的平均值很容易,但我坚持定义条件“如果平均值*0.8 <=数据行中的值之一<=平均值*1,2,则平均值== NaN”。

在此示例中,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)
...


最佳答案

试试这个:

# 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

关于python - 计算 df 的平均值,但如果 =>1 个值与该平均值相差 >20%,则平均值设置为 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62104920/

相关文章:

python - Tensorflow tf.matmul 示例不正确?

用于非零值计算的python pandas dataframe等效函数逻辑

javascript - 删除数组显示中的 NaN

python - 处理 Pandas read_csv 中的缺失数据

python - 组合两个 pandas 数据框,使相同的列索引/标题彼此相邻

python - python-rsa 模块的函数错误

python - 如何在 python 代码中利用 locals()?

python - 将类别列转换为 Python 中的一个字符串列

python - 返回以 pandas dataframe 作为参数的函数的输出

c++11 - std::numeric_limits::quiet_NaN() 与 std::nan() 与 NAN