如何在numpy数组中用0替换nan来计算平均值?

时间:2017-02-17 07:36:36

标签: python numpy

如何在以下数据集中将NaN替换为零?:我的目标是进行以下估计,假设matches是下面给出的数据集:

# average the data
avg = {}
for k, v in matches.items():
    avg[k] = sum(v) / float(len(v))
print(avg)

matches的内容:

{('AD', 'MM', 'TT'): [], ('AD', 'MM', 'VV'): [array([54.0, 97.0, 160.0, nan, 9.0, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan], dtype=object), array([176.0, 68.0, 166.0, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([nan, 55.0, 176.0, nan, 34.0, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan], dtype=object), array([38.0, 72.0, 466.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan], dtype=object), array([62.0, 20.0, 397.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan], dtype=object), array([40.0, 31.0, 94.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan], dtype=object), array([104.0, 70.0, 338.0, nan, 19.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([99.0, 62.0, 401.0, nan, 37.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([53.0, 109.0, 262.0, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([45.0, 55.0, 159.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan], dtype=object), array([80.0, 104.0, 438.0, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([81.0, 75.0, 141.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan], dtype=object), array([140.0, 43.0, 192.0, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([72.0, 26.0, 704.0, nan, 57.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([67.0, 49.0, 210.0, nan, 20.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([122.0, 67.0, 546.0, nan, 25.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([130.0, 61.0, 400.0, nan, 20.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([88.0, 133.0, 354.0, nan, nan, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([77.0, 42.0, 212.0, nan, 31.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object), array([138.0, 64.0, 132.0, nan, 49.0, nan, nan, nan, nan, nan, nan, nan,
       nan, nan, nan], dtype=object)]}

1 个答案:

答案 0 :(得分:0)

numpy.nanmean计算均值,忽略所有NaN;在你的情况下,这会产生下面的结果

In [1]: import numpy as np
   ...: matches = {('AD', 'MM', 'TT'): [], ('AD', 'MM', 'VV'): [[54.0, 97.0, 160.0, np.nan, 9.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 
   ...: np.nan, np.nan, np.nan, np.nan], [176.0, 68.0, 166.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.
   ...: nan, np.nan], [np.nan, 55.0, 176.0, np.nan, 34.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [38.0,
   ...:  72.0, 466.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [62.0, 20.0, 397.0, np.nan
   ...: , np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [40.0, 31.0, 94.0, np.nan, np.nan, np.nan, np.
   ...: nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [104.0, 70.0, 338.0, np.nan, 19.0, np.nan, np.nan, np.nan, np.nan, 
   ...: np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [99.0, 62.0, 401.0, np.nan, 37.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan
   ...: , np.nan, np.nan, np.nan], [53.0, 109.0, 262.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, n
   ...: p.nan], [45.0, 55.0, 159.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [80.0, 104.0
   ...: , 438.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [81.0, 75.0, 141.0, np.nan, np.
   ...: nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [140.0, 43.0, 192.0, np.nan, np.nan, np.nan, np.nan
   ...: , np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [72.0, 26.0, 704.0, np.nan, 57.0, np.nan, np.nan, np.nan, np.nan, np.n
   ...: an, np.nan, np.nan, np.nan, np.nan, np.nan], [67.0, 49.0, 210.0, np.nan, 20.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np
   ...: .nan, np.nan, np.nan], [122.0, 67.0, 546.0, np.nan, 25.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
   ...: , [130.0, 61.0, 400.0, np.nan, 20.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [88.0, 133.0, 354.0
   ...: , np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [77.0, 42.0, 212.0, np.nan, 31.0, np.n
   ...: an, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], [138.0, 64.0, 132.0, np.nan, 49.0, np.nan, np.nan, np.nan, n
   ...: p.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]]}
   ...: 
   ...: avg = {k: np.nanmean(v) for k, v in matches.items()}
   ...: avg
   ...: 
/usr/local/lib/python3.5/site-packages/numpy/lib/nanfunctions.py:703: RuntimeWarning: Mean of empty slice
  warnings.warn("Mean of empty slice", RuntimeWarning)
Out[1]: {('AD', 'MM', 'TT'): nan, ('AD', 'MM', 'VV'): 133.59420289855072}