【问题标题】:Calculating mean and standard deviation and ignoring 0 values计算平均值和标准差并忽略 0 值
【发布时间】:2020-09-01 21:52:12
【问题描述】:

我有一个包含子列表的列表列表,所有这些列表都包含浮点值。 例如,下面有 2 个列表,每个列表都有子列表:

 mylist =  [[[2.67, 2.67, 0.0, 0.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [0.0, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]], [[2.67, 2.67, 2.0, 2.0], [0.0, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [0.0, 0.0, 0.0, 0.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]]]

我想计算子列表的标准差和平均值,我应用的是:

mean = [statistics.mean(d) for d in mylist]
stdev = [statistics.stdev(d) for d in mylist]

但它也需要我不想要的 0.0 值,因为我将它们设置为 0 以免为空。有没有办法忽略这些 0,因为它们不存在于子列表中?根本不考虑它们?我找不到我如何做的方法。

【问题讨论】:

  • 我们为什么不使用合适的数据科学库,例如 numpy 或 pandas?
  • @Parfait 老实说,我是 python 新手,使用了很多数据列表,所以我现在正在学习。但如果使用这些库更容易,我会试一试

标签: python list mean standard-deviation sublist


【解决方案1】:

您可以使用 numpy 的 nanmean 和 nanstd 函数。

import numpy as np


def zero_to_nan(d):
    array = np.array(d)
    array[array == 0] = np.NaN
    return array


mean = [np.nanmean(zero_to_nan(d)) for d in mylist]
stdev = [np.nanstd(zero_to_nan(d)) for d in mylist]

【讨论】:

  • 这样的0会被忽略?
  • @piggy 实际上我刚刚意识到您在谈论 0 而不是缺失值。我调整了代码,现在它用缺失值替换了零,然后实现了 numpy 函数。
【解决方案2】:

您可以使用list comprehension 来完成此操作。

以下 lambda 函数将 nested 列表展平为单个列表并过滤掉所有零:

flatten = lambda nested: [x for sublist in nested for x in sublist if x != 0]

请注意,列表推导式有两个for 和一个if语句,类似于此代码 sn-p,其作用基本相同:

flat_list = []

for sublist in nested:
   for x in sublist:
       if x != 0:
           flat_list.append(x)

要将其应用于您的列表,您可以使用map。 map 函数将返回一个迭代器。要获取列表,我们需要将迭代器传递给list:

flat_list = list(map(flatten, myList))

现在你可以计算平均值和标准差了:

mean = [statistics.mean(d) for d in flat]
stdev = [statistics.stdev(d) for d in flat]

print(mean)
print(stdev)

【讨论】:

  • 感谢您提供代码说明和文档链接。这些是 Stack Overflow 上的最佳实践。这是一篇非常好的第一篇文章。
【解决方案3】:
mean = [statistics.mean(d) for d in mylist if d != 0]
stdev = [statistics.stdev(d) for d in mylist if d != 0]

【讨论】:

  • 这也有效!我会因为它的效率而接受上面的答案,但我问你的是正确的!非常感谢!
  • 欢迎来到 SO。虽然这段代码 sn-p 可能是解决方案,但包含解释确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案4】:

试试:

mean = [statistics.mean([k for k in d if k]) for d in mylist]
stdev = [statistics.stdev([k for k in d if k]) for d in mylist]

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2015-03-05
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多