Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以得到数据帧中所有列的修剪平均值吗?_Python_Pandas_Scipy - Fatal编程技术网

Python 我可以得到数据帧中所有列的修剪平均值吗?

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

问题是我想得到数据帧中所有列的修剪平均值(即给定列中值的平均值,不包括最大值和最小值)。某些列可能具有nan值。基本上,我希望得到与pandas.DataFrame.mean函数完全相同的功能,只是它是修剪后的平均值

显而易见的解决方案是使用scipytmean函数,并迭代df列。所以我做了:

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