我想计算数据帧的 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/