Je veux obtenir une liste des en-têtes de colonne d'un pandas DataFrame. Le DataFrame proviendra de l'entrée utilisateur, donc je ne saurai pas combien de colonnes il y aura ou comment elles seront appelées.
Par exemple, si on me donne un DataFrame comme ceci:
>>> my_dataframe
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
Je voudrais obtenir une liste comme celle-ci:
>>> header_list
['y', 'gdp', 'cap']
[*df]
pluslist(df)
oudf.columns.tolist()
, c'est grâce aux généralisations de décompression (PEP 448) .Réponses:
Vous pouvez obtenir les valeurs sous forme de liste en faisant:
Vous pouvez également simplement utiliser: (comme indiqué dans la réponse d'Ed Chum ):
la source
columns
d'attribut?df.column_names()
. Cette réponse est-elle toujours exacte ou obsolète?Il existe une méthode intégrée qui est la plus performante:
.columns
renvoie un index,.columns.values
retourne un tableau et cela a une fonction d'aide.tolist
pour retourner une liste.Si les performances ne sont pas aussi importantes pour vous, les
Index
objets définissent une.tolist()
méthode que vous pouvez appeler directement:La différence de performances est évidente:
Pour ceux qui détestent taper, vous pouvez simplement appeler
list
surdf
, comme ceci:la source
DataFrame
itérable n'a pas changé depuis le premier jour: pandas.pydata.org/pandas-docs/stable/basics.html#iteration . L'itérable renvoyé par un DataFrame a toujours été les colonnes, ce qui fait que le comportementfor col in df:
devrait toujours se comporter de la même manière, à moins que les développeurs ne lelist(df)
fassent et qu'il devrait toujours être une méthode valide. Notez quedf.keys()
c'est appeler dans l'implémentation interne de la structure de type dict renvoyant les clés qui sont les colonnes. Les downvotes inexplicables sont les dommages collatéraux à prévoir sur SO donc ne vous inquiétez pascolumns
attribut. Il y a une heure, j'ai lu que Law of Demeter faisait la promotion que l'appelant ne devrait pas dépendre de la navigation dans le modèle d'objet interne.list(df)
effectue une conversion de type explicite. Effet secondaire notable: le temps d'exécution et la consommation de mémoire augmentent avec ladf.keys()
méthode de taille de trame de données fait partie de la nature dict-dict d'unDataFrame
. Fait notable: le temps d'exécution dedf.keys()
est plutôt constant quelle que soit la taille de la trame de données - une partie de la responsabilité des développeurs de pandas.A fait quelques tests rapides, et sans surprise la version intégrée utilisant
dataframe.columns.values.tolist()
est la plus rapide:(J'aime quand même vraiment
list(dataframe)
, alors merci EdChum!)la source
C'est encore plus simple (par pandas 0.16.0):
vous donnera les noms des colonnes dans une belle liste.
la source
Pour répertorier les colonnes d'une trame de données en mode débogueur, utilisez une compréhension de liste:
Soit dit en passant, vous pouvez obtenir une liste triée simplement en utilisant
sorted
:la source
list(df)
fonctionnerait-il qu'avec des trames de données à incrémentation automatique? Ou cela fonctionne-t-il pour toutes les trames de données?[c for c in df]
.Surpris de ne pas l'avoir vu jusqu'à présent, je vais donc laisser cela ici.
Déballage Iterable étendu (python3.5 +):
[*df]
et amisDes généralisations de déballage (PEP 448) ont été introduites avec Python 3.5. Ainsi, les opérations suivantes sont toutes possibles.
Si vous voulez un
list
....Ou, si vous en voulez un
set
,Ou, si vous en voulez un
tuple
,Ou, si vous souhaitez stocker le résultat quelque part,
... si vous êtes le genre de personne qui convertit le café en sons de frappe, eh bien, cela va consommer votre café plus efficacement;)
Vérification visuelle
Depuis que j'ai vu cela discuté dans d'autres réponses, vous pouvez utiliser le déballage itérable (pas besoin de boucles explicites).
Critique des autres méthodes
N'utilisez pas de
for
boucle explicite pour une opération qui peut être effectuée sur une seule ligne (les compréhensions de liste sont correctes).Ensuite, l'utilisation
sorted(df)
ne conserve pas l'ordre d'origine des colonnes. Pour cela, vous devez utiliser à lalist(df)
place.Ensuite,
list(df.columns)
etlist(df.columns.values)
sont de mauvaises suggestions (à partir de la version actuelle, v0.24). Les deuxIndex
(retour dedf.columns
) et les tableaux numpy (retournées pardf.columns.values
) définissent la.tolist()
méthode qui est plus rapide et plus idiomatiques.Enfin, la listification, c'est-à-dire
list(df)
ne doit être utilisée que comme une alternative concise aux méthodes susmentionnées pour python <= 3.4 lorsque le déballage étendu n'est pas disponible.la source
C'est disponible en tant que
my_dataframe.columns
.la source
header_list = list(my_dataframe.columns)
df.columns.tolist()
.C'est intéressant mais
df.columns.values.tolist()
c'est presque 3 fois plus rapide alorsdf.columns.tolist()
mais je pensais que ce sont les mêmes:la source
.values
renvoie le tableau numpy sous-jacent, et faire quelque chose avec numpy est presque toujours plus rapide que de faire la même chose avec pandas directement.Un DataFrame suit la convention de type dict consistant à itérer sur les «clés» des objets.
Créer une liste de clés / colonnes - méthode objet
to_list()
et manière pythoniqueL'itération de base sur un DataFrame renvoie des étiquettes de colonne
Ne convertissez pas un DataFrame en liste, juste pour obtenir les étiquettes de colonne. N'arrêtez pas de penser en recherchant des exemples de code pratiques.
la source
df.columns
c'est beaucoup plus rapide quedf.keys()
. Je ne sais pas pourquoi ils ont à la fois une fonction et un attribut pour la même chose (eh bien, ce n'est pas la première fois que je vois 10 façons différentes de faire quelque chose dans les pandas).Dans le cahier
Pour l'exploration de données dans le bloc-notes IPython, ma méthode préférée est la suivante:
Ce qui produira une liste alphabétique facile à lire.
Dans un référentiel de code
Dans le code, je trouve cela plus explicite à faire
Parce qu'il dit aux autres qui lisent votre code ce que vous faites.
la source
sorted(df)
change l'ordre. Utiliser avec précaution.la source
comme l'a répondu Simeon Visser ... vous pourriez faire
ou
Mais je pense que la plupart du sweet spot est:
C'est explicite, en même temps pas inutilement long.
la source
list
n'a de mérite que si vous l'appelezdf
directement (par exemple, la concision). L'accès à l'.columns
attribut renvoie unIndex
objet qui a unetolist()
méthode définie dessus, et l'appel qui est plus idiomatique que listant leIndex
. Mélanger des idiomes juste pour être complet n'est pas une bonne idée. Il en va de même pour lister le tableau que vous obtenez.values
.Pour une vérification visuelle rapide et nette, essayez ceci:
la source
Cela nous donne les noms des colonnes dans une liste:
Une autre fonction appelée tolist () peut également être utilisée:
la source
Je pense que la question mérite des explications supplémentaires.
Comme l'a noté @fixxxer, la réponse dépend de la version pandas que vous utilisez dans votre projet. Que vous pouvez obtenir avec la
pd.__version__
commande.Si vous êtes pour une raison comme moi (sur Debian Jessie, j'utilise 0.14.1) en utilisant une version plus ancienne de pandas que 0.16.0, alors vous devez utiliser:
df.keys().tolist()
car il n'y a pas encore dedf.columns
méthode implémentée.L'avantage de cette méthode de touches est qu'elle fonctionne même dans les nouvelles versions de pandas, donc elle est plus universelle.
la source
la source
[n for n in dataframe.columns]
Même si la solution fournie ci-dessus est agréable. Je m'attendrais également à ce que quelque chose comme frame.column_names () soit une fonction dans pandas, mais comme ce n'est pas le cas, il serait peut-être bien d'utiliser la syntaxe suivante. Il préserve en quelque sorte le sentiment que vous utilisez les pandas de manière appropriée en appelant la fonction "tolist": frame.columns.tolist ()
la source
Si le DataFrame possède un index ou un multi-index et que vous souhaitez que ceux-ci soient également inclus en tant que noms de colonne:
Il évite d'appeler reset_index () qui a un impact de performance inutile pour une opération aussi simple.
J'ai eu besoin de cela plus souvent parce que je transfère des données à partir de bases de données où l'index de la trame de données correspond à une clé primaire / unique, mais n'est vraiment qu'une autre "colonne" pour moi. Il serait probablement logique pour les pandas d'avoir une méthode intégrée pour quelque chose comme ça (totalement possible, je l'ai raté).
la source
Cette solution répertorie toutes les colonnes de votre objet my_dataframe:
la source