【问题标题】:Numpy nanmean and dataframe (possible bug?)Numpy nanmean 和数据框(可能的错误?)
【发布时间】:2014-11-13 07:16:12
【问题描述】:

我想知道这是否是一个错误,或者我可能不明白 nanmean 应该如何处理数据框。如果我将数据帧转换为数组似乎可以工作,但不是直接在数据帧上,也不会引发任何异常。最初注意到这里:Fill data gaps with average of data from adjacent days

df1 = DataFrame({ 'x': [1,3,np.nan] })
df2 = DataFrame({ 'x': [2,np.nan,5] })

    x
0   1
1   3
2 NaN

    x
0   2
1 NaN
2   5

In [1503]: np.nanmean( [df1,df2], axis=0 )
Out[1503]: 
     x
0  1.5
1  NaN
2  NaN

In [1504]: np.nanmean( [df1.values, df2.values ], axis=0 )
Out[1504]: 
array([[ 1.5],
       [ 3. ],
       [ 5. ]])

【问题讨论】:

标签: python numpy pandas


【解决方案1】:

这绝对是一种奇怪的行为。我没有答案,但似乎整个 pandas DataFrames 可以是 numpy 数组的元素,这会导致奇怪的行为。我猜应该尽可能避免这种情况,我不确定为什么 DataFrames 是有效的 numpy 元素。

np.nanmean 可能在应用操作之前将参数转换为np.array。那么让我们看看

a = np.array([df1, df2])

首先请注意,这不是您可能认为的 3 维数组,它实际上是一个 1 维数组,其中每个 元素 是一个 DataFrame

print(a.shape)
# (2,)

print(type(a[0]))
# <class 'pandas.core.frame.DataFrame'>

所以nanmean 取两个DataFrames 的平均值,而不是数据帧内的值。这也意味着轴参数实际上并没有做任何事情,如果你尝试使用axis=1,你会得到一个错误,因为它是一个一维数组。

np.nanmean(a, axis=1)
# IndexError: tuple index out of range

print(np.nanmean(a))
#      x
# 0  1.5
# 1  NaN
# 2  NaN

这就是为什么您得到的答案与使用值创建数组时不同的原因。当您使用值时,它会正确创建 3 维数字数组,而不是奇怪的 1 维数据帧数组。

b = np.array([df1.values, df2.values ])

print(b.shape)
# (2, 3, 1)

print(type(b[1]))
# <class 'numpy.ndarray'>

print(type(b[0,0,0]))
# <class 'numpy.float64'>

这些数据帧数组有一些特别奇怪的行为。假设我们创建了一个长度为 3 的数组,其中第三个元素是 np.nan。您可能希望从nanmean 得到与我们之前对a 相同的答案,因为它应该排除nan 值,对吧?

print(np.nanmean(np.array([df1, df2, np.nan])))
#     x
# 0 NaN
# 1 NaN
# 2 NaN

是的,所以我不确定。最好避免制作这些。

【讨论】:

  • 非常有趣...谢谢!
  • I'm not sure why DataFrames are valid numpy elements at all pandas 是建立在 numpy 数组上的,但这里的关键是不要期望它总是像你想象的那样表现,尤其是对数据帧:pandas.pydata.org/pandas-docs/stable/…
猜你喜欢
  • 2016-09-30
  • 1970-01-01
  • 2020-05-02
  • 2018-04-13
  • 2017-11-29
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多