我想知道这是不是一个错误,或者我可能不了解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. ]])
答案 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
是的,所以我不确定。最好避免制作这些。