2014-09-18 115 views
1

我想知道這是一個錯誤,或者可能我不明白nanmean應該如何與數據框一起工作。似乎工作,如果我將數據幀轉換爲數組,但不是直接在數據幀上,也不會引發任何異常。這裏本來注意到:Fill data gaps with average of data from adjacent daysNumpy的nanmean和dataframe(可能的bug?)

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

這看起來像一個錯誤,但我不清楚,如果這是熊貓或numpy的錯誤,因爲歷史上有一些問題,其中轉換到numpy數組是不成立的,我在scikit中遇到過很多:http: //stackoverflow.com/questions/21390084/valueerror-array-contains-nan-or-infinity-in-assert-all-finite-during-linearsv/21410340#21410340和http://stackoverflow.com/questions/23095725/讓scikit-learn-to-work-with-pandas – EdChum 2014-09-18 20:05:54

+0

此外:http://stackoverflow.com/questions/22669208/attributeerror-series-object-has-no-attribute-searchsorted-pandas/22669229#22669229。這可能是一個與numpy沒有調用'__array__'的問題,所以我不知道這是否是一個大熊貓的錯誤​​ – EdChum 2014-09-18 20:09:29

+0

我想這個教訓是不會假設numpy會以你認爲的方式來翻譯一個數據框或一系列。只有在有任何疑問時才使用.values ... – JohnE 2014-09-19 14:53:00

回答

1

這絕對是奇怪的行爲。我沒有答案,但大多數看來,整個熊貓可以是numpy數組的元素,這會導致奇怪的行爲。我猜這應該儘可能避免,我不知道爲什麼DataFrames是有效的numpy元素。

np.nanmean可能會在應用操作之前將參數轉換爲np.array。所以,讓我們看看

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

首先請注意,這不是一個3-d陣列就像你可能會認爲,它實際上是一個1-d陣列,其中每個元素DataFrame

print(a.shape) 
# (2,) 

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

所以nanmean走不dataframes內值的兩種DataFrame S的平均。這也意味着軸參數實際上沒有做任何事情,如果你嘗試使用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'> 

dataframes的這些陣列有一些特別怪異的行爲雖然。假設我們製作了第三個元素爲np.nan的3長陣列。您可能會希望從nanmean得到與我們之前使用a相同的答案,因爲它應該排除nan的值,對吧?

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

是的,所以我不確定。最好避免做這些。

+0

非常有趣......謝謝! – JohnE 2014-09-19 14:54:00

+2

'我不確定爲什麼DataFrames是所有有效的numpy元素'大熊貓建立在numpy數組上,但關鍵在於不要指望它總是表現得像你想象的那樣,特別是對於數據框:http:// pandas。 pydata.org/pandas-docs/stable/dsintro。HTML#數據幀的互操作性與 - numpy的函數 – EdChum 2014-09-19 15:29:40