Numpy nanmean和数据帧(可能的错误?)

时间:2014-09-18 19:55:24

标签: python numpy pandas

我想知道这是不是一个错误,或者我可能不了解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. ]])

1 个答案:

答案 0 :(得分:1)

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

在应用操作之前,

np.nanmean可能会将参数转换为np.array。所以让我们来看看

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

首先请注意,这不是您想象的三维数组,它实际上是一维数组,其中每个元素都是DataFrame

print(a.shape)
# (2,)

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

因此nanmean取两个DataFrame的均值,而不是数据帧内的值。这也意味着axis参数实际上没有做任何事情,如果你尝试使用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

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

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

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