我可以得到具有 nan 值的数据框中所有列的修剪平均值吗?

Lod*_*e66 5 python scipy pandas

问题是我想获得 pandas 数据框中所有列的修剪平均值(即给定列中的值的平均值,不包括最大值和最小值)。某些列可能具有 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]))
Run Code Online (Sandbox Code Playgroud)

这很有效,直到我遇到 nan 值,这导致 tmean 窒息。更糟糕的是,当我删除数据框中的 nan 值时,有些数据集被完全清除,因为它们在每一列中都有一个 nan 值。这意味着当我将所有数据集合并到一个主集中时,主集中的修剪均值应该存在的位置将会出现漏洞。

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

(请注意,我的代码正在使用有限的硬件计算大型数据集的大量描述性统计数据;高度复杂或低效的解决方法可能不是最佳的。但希望我只是错过了一些简单的东西。)

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

Shi*_*ijo 1

你可以使用 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)
Run Code Online (Sandbox Code Playgroud)

输出

         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
Run Code Online (Sandbox Code Playgroud)