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.
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
** 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'. –