2014-10-10 34 views
1
切換

我有以下的數據幀:含義在pd.DataFrame.all

>>> df = pd.DataFrame([[True, np.nan, False],[True,np.nan,False],[True,np.nan,False]]) 
>>> df 
     0 1  2 
0 True NaN False 
1 True NaN False 
2 True NaN False 

按照docs,做df.all(axis=1, skipna=True)對應於檢查是否所有的值都爲真逐列,所以預期它給予True,True,False,但它給出了False,False,False。似乎軸的含義已被翻轉,即axis = 0是針對列的。

這似乎與軸的在DataFrame.dropna的含義,例如矛盾,

>>> df.dropna(axis=1) 
     0  2 
0 True False 
1 True False 
2 True False 

以及在np.delete

這是故意的嗎?如果是這樣,爲什麼?

+1

這看起來像在文檔中的錯誤(可能是一個bug)有一個相關的問題:http://stackoverflow.com/questions/25773245/ambiguity-in-pandas-dataframe-axis-definition?rq=1關於軸的含義的明顯切換,這是由於numpy,比較你嘗試'np.all(df,axis = 0)'和'np.all(df,axis = 1)時發生的情況'輸出是和熊貓一樣 – EdChum 2014-10-10 09:19:21

回答

1

我認爲這是在文檔一個錯誤,因爲這種方法會調用numpy.all,如果你比較輸出它們是相同的:

In [211]: 

np.all(df,axis=0) 
Out[211]: 
array([True, nan, False], dtype=object) 
In [212]: 

np.all(df, axis=1) 
Out[212]: 
array([False, False, False], dtype=object) 

而且dropnanp.delete同意輸出:

In [213]: 

df.dropna(axis=1) 
Out[213]: 
     0  2 
0 True False 
1 True False 
2 True False 
In [222]: 

np.delete(df.values, 1,axis=1) 
Out[222]: 
array([[True, False], 
     [True, False], 
     [True, False]], dtype=object) 
1

我同意這並不總是很直觀,但我認爲這種行爲是一致的。

axis=0工作在r0ws,axis=1作品橫跨各欄。

因此,df.all(axis=1, skipna=True)返回False, False, False,因爲它執行跨所有列的操作(此處返回每行的all(True, True, False)的結果)。同時,df.all(axis=0, skipna=True)查看行(依次爲每列)。只有第2列中的行包含False值,因此是結果。

同樣,dropna(axis=1)delete(axis=1)對列啓動操作(即查看每列以查看是否應該刪除或刪除)。列0和2不包含任何NaN值,因此保留,而列1消失。