我是否可以使用nan值获得数据框中所有列的修剪平均值?

时间:2016-09-01 09:32:49

标签: python pandas scipy

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

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

import scipy as sp

trim_mean = []

for i in data_clean3.columns:
    trim_mean.append(sp.tmean(data_clean3[i]))

这很有效,直到我遇到了纳米值,导致tmean窒息。更糟糕的是,当我在数据框中删除nan值时,有些数据集完全被清除,因为它们在每列中都有一个nan值。这意味着当我将所有数据集合并到主集中时,主集上的孔应该是修剪后的平均值。

有没有人知道解决这个问题的方法?就像在,有没有办法让tmean表现得像标准的scipy stats函数并忽略nan值?

(请注意,我的代码正在使用有限的硬件计算大量数据集的大量描述性统计数据;高度参与或低效的变通办法可能不是最佳的。但希望,我只是遗漏了一些简单的东西。)

编辑:有人在评论中建议(已经消失了吗?)我应该使用trim_mean scipy函数,它允许你在特定比例的数据上进行顶部和尾部。这是只是说这个解决方案不适合我,因为我的数据集大小不等,所以我无法指定固定比例的数据,可以在每种情况下删除;它必须始终只是最大值和最小值。)

2 个答案:

答案 0 :(得分:1)

考虑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
df.mean()

A    29.756987
B    30.450617
dtype: float64

答案 1 :(得分:0)

你使用df.mean(skipna = True)DataFrame.mean

df1 = pd.DataFrame([[5, 1, 'a'], [6, 2, 'b'],[7, 3, 'd'],[np.nan, 4, 'e'],[9, 5, 'f'],[5, 1, 'g']],  columns =  ["A", "B", "C"])
print df1
df1 = df1[df1.A != df1.A.max()] # Remove max values
df1 = df1[df1.A != df1.A.min()] # Remove min values

print "\nDatafrmae after removing max and min\n"
print df1
print "\nMean of A\n"

print df1["A"].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