2017-10-05 6 views
1

J'ai un dataframe:Pandas comportement dataframe: liste (df) par rapport à len (df)

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

Si j'appelle list sur cet objet, je reçois ceci:

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

Mais si je appeler len sur cet objet, je reçois ceci:

>>> len(df) 
3 

ce dernier len appel est plus intuitif à m e - c'est comme trouver le nombre d'éléments dans un itérable. Je ne sais pas quelle est la différence de comportement exacte derrière ces deux appels de fonction sur un pandas.DataFrame. La sortie de dis.dis ressemble beaucoup:

>>> 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 

J'ai donc aucune indication quant à savoir pourquoi appeler list sur une trame de données renvoie une liste de noms de colonnes en len retourne le nombre de lignes dans l'objet. Lorsque j'appelle len(df), this method est-il appelé sur le DataFrame?

Remarque: les comparaisons de fonctions list et len ne sont qu'un exemple. Je suis vraiment à la recherche d'informations sur la façon dont pandas.DataFrame s interagissent/se comportent lors de l'interfaçage avec une variété de fonctions.

Répondre

2

Telle est la définition de __len__ dans pandasDataFrame objet:

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

donc comme prévu, vous obtenez Nombre de lignes (je suppose que la décision de conception?)

En ce qui concerne list(df), il doit faire avec ce __iter__ renvoie, et dans ce cas, vous pouvez le retracer à NDFrame qui est la base de données de données, et il est dit:

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

_info_axis est l'axe des colonnes pour DataFrames.

+0

Comment les pandas "savent" appeler "__len__" quand j'appelle "len (df)"? Ce comportement ne fonctionne pas, AFAIK, si j'ai appelé une fonction 'foo' sur une méthode' __foo__' d'un objet arbitraire. – blacksite

+0

** pandas ** ne sait pas, mais un python ** class ** sait. En d'autres termes, '__len__' est la méthode magique que n'importe quelle classe peut implémenter pour définir' len () ', tout comme' __ge__' est la méthode magique qu'une classe peut implémenter pour définir l'opérateur> =. Sachant cela, 'df' n'est rien d'autre qu'un objet de classe' DataFrame'. –