【问题标题】:How to take average between NaN values?如何在 NaN 值之间取平均值?
【发布时间】:2022-01-14 01:46:43
【问题描述】:

我有一个包含数字和NaN 值的简单列表。有没有办法在两个NaN 值之间取AVG?一个例子可能是这样的:

list = [NaN, 5, 6, 7, NaN, NaN, NaN, 6, 2, 8, 5, 4, NaN, NaN]

我希望输出像

Output = [6,5] 

【问题讨论】:

  • 如何从两个 NAN 值中获取 AVG?
  • 任何一维列表的平均值不应该只有 1 个元素吗?
  • 你能更好地解释你的问题吗?平均值如何输出两个组件的列表?您对该输出有何期待?
  • @Tamil Selvan 他们的意思是平均之间 Nan 值不是他们
  • “平均值”是指平均值、中位数或众数,还是其他平均值?

标签: python average nan


【解决方案1】:

使用来自itertoolsgroupby -

import numpy as np
from itertools import groupby
NaN = np.nan
lst = [NaN, 5, 6, 7, NaN, NaN, NaN, 6, 2, 8, 5, 4, NaN, NaN]
[np.mean(list(g)) for k, g in groupby(lst, key=lambda x: x is not NaN) if k]
# [6.0, 5.0]

【讨论】:

  • 你可以通过使用内置的import statistics; statistics.mean(...)来避免numpy
【解决方案2】:

不需要额外技能的简单方法:

import numpy as np

## NaN is assumed to be pre-defined by the users, e.g.: NaN = np.nan or NaN = float('nan')

def get_mean_between_nan(ar):
    out = list()
    t = list()
    for x in ar:
        if np.isnan(x):
            if len(t) > 0:
                out.append(np.mean(t))
                t = list()
        else:
            t.append(x)
    if len(t) > 0:
        out.append(np.mean(t))
    return out

【讨论】:

  • 除了 numpy 没有其他包! :)
  • np.isnan(NaN) 将在NaN 上抛出NameError
  • NaN 不是“不是数字”的标准标识符。它应该首先由用户定义。
【解决方案3】:

https://stackoverflow.com/a/30825549/1021819 开始,首先将列表拆分为一个分块的列表列表:

NaN=None # or np.nan, float('nan'), 'nan' or any other separator value you like = even '/'
my_list = [NaN, 5, 6, 7, NaN, NaN, NaN, 6, 2, 8, 5, 4, NaN, NaN]

from itertools import groupby
chunks = list(list(g) for k,g in groupby(my_list, key=lambda x: x is not NaN) if k))
# [[5, 6, 7], [6, 2, 8, 5, 4]]

那么就可以使用内置的statistics.mean(),如下:

import statistics
output = [statistics.mean(chunk) for chunk in chunks]
# [6, 5]

你去。

注意事项:

  1. 不需要numpy。但是,如果您确实想要一个纯 numpy 解决方案,您可以使用 https://stackoverflow.com/a/31863171/1021819
  2. 不要使用list 作为变量名,因为它是内置类型的名称!

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2016-04-06
    • 2019-03-21
    • 1970-01-01
    • 2013-04-01
    • 2020-11-28
    • 2018-03-26
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多