2017-10-05 300 views
1

我有一個數據幀:熊貓數據幀的行爲:列表(DF)與LEN(DF)

import pandas as pd 
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) 

如果我把list這個對象上,我得到這個:

>>> list(df) 
['A', 'B'] 

但是,如果我調用len這個對象上,我得到這個:

>>> len(df) 
3 

後者len通話更直觀到m e - 就像查找可迭代元素的數量。我不清楚在pandas.DataFrame上這兩個函數調用後面行爲的確切區別。從dis.dis輸出看起來非常相似:

>>> dis.dis('len(df)') 
    1   0 LOAD_NAME    0 (len) 
       2 LOAD_NAME    1 (df) 
       4 CALL_FUNCTION   1 
       6 RETURN_VALUE 
>>> dis.dis('list(df)') 
    1   0 LOAD_NAME    0 (list) 
       2 LOAD_NAME    1 (df) 
       4 CALL_FUNCTION   1 
       6 RETURN_VALUE 

,所以我沒有任何跡象顯示原因調用一個數據幀listlen返回對象的行數返回列名的列表。當我撥打​​時,this method被撥打DataFrame

注意:listlen功能比較只是一個例子。我真的在尋找有關如何在與各種功能接口時如何相互作用/行爲的信息。

回答

2

這是pandasDataFrame對象的__len__定義:

def __len__(self): 
    return len(self.index) 

,從而預期,你行#(我猜的設計決定?)

至於list(df),它有用什麼__iter__返回,在這種情況下,你可以追溯到NDFrame這是數據框的基類,它說:

def __iter__(self): 
    """Iterate over infor axis""" 
    return iter(self._info_axis) 

其中_info_axis是列軸線DataFrames。

+0

怎麼大熊貓 「知道」 來稱呼'__len__',不過,當我打電話'LEN(DF)'?如果我在任意對象的__foo__方法上調用函數foo,那麼這種行爲不起作用。 – blacksite

+0

** pandas **不知道,但一個python **類**知道。換句話說,'__len__'是任何類可以實現以定義魔術方法'LEN()',很像'__ge__'是魔術方法一個類可以實現以定義> =運算符。知道這個,'df'不過是'DataFrame'類的對象。 –