【发布时间】: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)
...
【问题讨论】: