Python 我可以得到数据帧中所有列的修剪平均值吗?
问题是我想得到数据帧中所有列的修剪平均值(即给定列中值的平均值,不包括最大值和最小值)。某些列可能具有nan值。基本上,我希望得到与pandas.DataFrame.mean函数完全相同的功能,只是它是修剪后的平均值 显而易见的解决方案是使用scipytmean函数,并迭代df列。所以我做了:Python 我可以得到数据帧中所有列的修剪平均值吗?,python,pandas,scipy,Python,Pandas,Scipy,问题是我想得到数据帧中所有列的修剪平均值(即给定列中值的平均值,不包括最大值和最小值)。某些列可能具有nan值。基本上,我希望得到与pandas.DataFrame.mean函数完全相同的功能,只是它是修剪后的平均值 显而易见的解决方案是使用scipytmean函数,并迭代df列。所以我做了: import scipy as sp trim_mean = [] for i in data_clean3.columns: trim_mean.append(sp.tmean(data_c
import scipy as sp
trim_mean = []
for i in data_clean3.columns:
trim_mean.append(sp.tmean(data_clean3[i]))
这非常有效,直到我遇到nan值,这导致tmean阻塞。更糟糕的是,当我在dataframe中删除nan值时,有些数据集被完全删除,因为它们在每一列中都有一个nan值。这意味着,当我将所有数据集合并到一个主数据集时,主数据集上的修剪平均值将出现漏洞
有人知道解决这个问题的方法吗?如中所示,是否有办法让tmean像标准的scipy stats函数一样工作,并忽略nan值
(请注意,我的代码是在硬件有限的大型数据集上计算大量描述性统计数据;高度复杂或低效的变通方法可能不是最佳选择。不过,希望我只是缺少一些简单的东西。)
(编辑:有人在一条评论中建议(该评论已经消失了?)我应该使用trim_mean scipy函数,它允许您对特定比例的数据进行顶部和尾部处理。这只是说,此解决方案对我不起作用,因为我的数据集大小不等,因此我无法指定在任何情况下都可以删除的固定比例的数据;它必须始终是最大值和最小值s、 )您可以使用df.mean(skipna=True)
输出
A B C
0 5.0 1 a
1 6.0 2 b
2 7.0 3 d
3 NaN 4 e
4 9.0 5 f
5 5.0 1 g
Datafrmae after removing max and min
A B C
1 6.0 2 b
2 7.0 3 d
3 NaN 4 e
Mean of A
6.5
考虑
df
np.random.seed()
data = np.random.choice((0, 25, 35, 100, np.nan),
(1000, 2),
p=(.01, .39, .39, .01, .2))
df = pd.DataFrame(data, columns=list('AB'))
用和和和除以相关的标准化器来构造你的平均值
(df.sum() - df.min() - df.max()) / (df.notnull().sum() - 2)
A 29.707674
B 30.402228
dtype: float64
这对您有用吗
(pd.DataFrame(data\u clean3.sum()-data\u clean3.max()-data\u clean3.min()).T)。mean()
。谢谢,这是我所需要的一个很好的尝试,但我认为可能存在一个问题,因为最大值和最小值可能在每列中出现不止一次。因此,从列的总和中减去每个值可能无法准确反映修剪后的平均值?谢谢,但与上面shivsn的suugestion一样,如果最大值或最小值出现多次,这不可能证明有问题吗?@Lodore66取决于,如果发生多次,您希望发生什么?理想情况下,我希望从df中删除max/min的所有实例,以便平均值仅为介于两者之间的值。我想这会使除数成为问题,因为可能会删除2个以上的值;非常感谢!出于某种原因,特定的语法不起作用(版本问题?),因此我通过在列之间循环并用“NaN”替换max/min值来实现它。例如,code
for I in data_clean2.columns:trimmed_mean.append(data_clean2[I].replace(data_clean2[I].max(),'NaN'))code
。谢谢你的主意!
(df.sum() - df.min() - df.max()) / (df.notnull().sum() - 2)
A 29.707674
B 30.402228
dtype: float64
df.mean()
A 29.756987
B 30.450617
dtype: float64