Voici mon code pour générer une trame de données:
import pandas as pd
import numpy as np
dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB'))
alors j'ai eu le dataframe:
+------------+---------+--------+
| | A | B |
+------------+---------+---------
| 0 | 0.626386| 1.52325|
+------------+---------+--------+
Quand je tape la commande:
dff.mean(axis=1)
J'ai eu :
0 1.074821
dtype: float64
Selon la référence des pandas, axe = 1 représente les colonnes et je m'attends à ce que le résultat de la commande soit
A 0.626386
B 1.523255
dtype: float64
Voici donc ma question: que signifie l'axe des pandas?
axis=0
indique l'agrégation le long des lignes etaxis=1
indique l'agrégation le long des colonnes est due à la façon dont vous indexez dans une trame de données. Dansdf.iloc[row, column]
,row
est dans la position d'index 0 etcolumn
est dans la position d'index 1. Numpy généralise cela à N dimensions, c'est là que penser en termes d'axe que l'agrégation s'effondre commence à avoir plus de sens que "en ligne" ou "en colonne" ".df.drop("A", axis = 1)
la colonne A sera supprimée. Ce n'est pas "le long de la ligne" ni "par ligne", mais enaxis=0
signifie que chaque ligne est un bloc, nous ne pouvons manipuler que DataFrame entre les lignes au lieu de la ligne interne.axis=1
signifie que chaque colonne est un bloc, nous ne pouvons manipuler que l'inter-colonne DataFrame au lieu de la colonne intérieure. Donc, si vous utilisezdf.drop("A", axis = 1)
, il supprimera une colonne entière.Ces réponses aident à expliquer cela, mais ce n'est toujours pas parfaitement intuitif pour un non-programmeur (c'est-à-dire quelqu'un comme moi qui apprend Python pour la première fois dans le contexte d'un cours de science des données). Je trouve toujours que l'utilisation des termes «le long» ou «pour chaque» par rapport aux lignes et aux colonnes prête à confusion.
Ce qui est plus logique pour moi, c'est de le dire ainsi:
Ainsi, une moyenne sur l'axe 0 sera la moyenne de toutes les lignes de chaque colonne, et une moyenne sur l'axe 1 sera la moyenne de toutes les colonnes de chaque ligne.
En fin de compte, cela signifie la même chose que @zhangxaochen et @Michael, mais d'une manière qui m'est plus facile à internaliser.
la source
Visualisons (tu te souviendras toujours),
Dans Pandas:
Supposons que, pour effectuer l'opération concat () sur dataframe1 et dataframe2, nous prendrons dataframe1 et sortirons la 1ère ligne de dataframe1 et la placerons dans le nouveau DF, puis nous retirerons une autre ligne de dataframe1 et la placerons dans un nouveau DF, nous répétons ce processus jusqu'à nous atteignons le bas de dataframe1. Ensuite, nous faisons le même processus pour dataframe2.
Fondamentalement, empiler dataframe2 au-dessus de dataframe1 ou vice versa.
Par exemple, faire une pile de livres sur une table ou un sol
Supposons que pour effectuer l'opération concat () sur dataframe1 et dataframe2, nous allons retirer la 1ère colonne complète (aka 1ère série) de dataframe1 et la placer dans le nouveau DF, puis nous retirons la deuxième colonne de dataframe1 et nous la maintenons à côté (latéralement) ) , nous devons répéter cette opération jusqu'à ce que toutes les colonnes soient terminées. Ensuite, nous répétons le même processus sur dataframe2. Fondamentalement, empilement latéral de dataframe2.
Par exemple, organiser des livres sur une étagère.
la source
axis
fait référence à la dimension du tableau, dans le cas depd.DataFrame
saxis=0
est la dimension qui pointe versaxis=1
le bas et celle qui pointe vers la droite.Exemple: pensez à une
ndarray
forme(3,5,7)
.a
est un 3 dimensionsndarray
, c'est-à-dire qu'il a 3 axes ("axes" est pluriel de "axe"). La configuration dea
ressemblera à 3 tranches de pain où chaque tranche est de dimension 5 par 7.a[0,:,:]
se référera à la 0-ème tranche,a[1,:,:]
se référera à la 1ère tranche etc.a.sum(axis=0)
s'appliquera lesum()
long de l'axe 0-ème dea
. Vous ajouterez toutes les tranches et vous vous retrouverez avec une tranche de forme(5,7)
.a.sum(axis=0)
est équivalent àb
eta.sum(axis=0)
ressemblera tous les deux à ceciDans a
pd.DataFrame
, les axes fonctionnent de la même manière que dansnumpy.array
s:axis=0
appliquerasum()
ou toute autre fonction de réduction pour chaque colonne.NB Dans la réponse de @ zhangxaochen, je trouve les phrases "le long des lignes" et "le long des colonnes" un peu déroutantes.
axis=0
doit faire référence à "le long de chaque colonne" etaxis=1
"le long de chaque ligne".la source
La façon la plus simple pour moi de comprendre est de dire si vous calculez une statistique pour chaque colonne (
axis = 0
) ou chaque ligne (axis = 1
). Si vous calculez une statistique, disons une moyenne,axis = 0
vous obtiendrez cette statistique pour chaque colonne. Donc, si chaque observation est une ligne et chaque variable est dans une colonne, vous obtiendrez la moyenne de chaque variable. Si vous définissezaxis = 1
vous calculez votre statistique pour chaque ligne. Dans notre exemple, vous obtiendrez la moyenne de chaque observation pour toutes vos variables (peut-être voulez-vous la moyenne des mesures connexes).axis = 0
: par colonne = par colonne = le long des lignesaxis = 1
: par ligne = par ligne = le long des colonnesla source
axis=0
nous ne restons pas sur la ligne disons quand, disons, calculer la moyenne; nous parcourons plutôt toutes les lignes d'une colonne.Regardons le tableau du Wiki. Il s'agit d'une estimation du PIB du FMI de 2010 à 2019 pour les dix premiers pays.
1. Axe 1 agira pour chaque ligne sur toutes les colonnes
Si vous voulez calculer le PIB moyen (moyenne) pour chaque pays au cours de la décennie (2010-2019), vous devez faire,
df.mean(axis=1)
. Par exemple, si vous souhaitez calculer le PIB moyen des États-Unis de 2010 à 2019,df.loc['United States','2010':'2019'].mean(axis=1)
2. Axe 0 agira pour chaque colonne sur toutes les lignes
Si je veux calculer le PIB moyen (moyenne) pour chaque année pour tous les pays, vous devez faire,
df.mean(axis=0)
. Par exemple, si vous souhaitez calculer le PIB moyen de l'année 2015 pour les États-Unis, la Chine, le Japon, l'Allemagne et l'Inde,df.loc['United States':'India','2015'].mean(axis=0)
Remarque: Le code ci-dessus ne fonctionnera qu'après avoir défini la colonne "Pays (ou territoire dépendant)" comme Index, en utilisant
set_index
méthode.la source
L'axe en vue de la programmation est la position dans le tuple de forme. Voici un exemple:
La moyenne sur l'axe entraînera la suppression de cette dimension.
En se référant à la question d'origine, la forme dff est (1,2). L'utilisation d'axe = 1 changera la forme en (1,).
la source
Le concepteur de pandas, Wes McKinney, travaillait intensivement sur les données financières. Considérez les colonnes comme des noms d'actions et les indices comme des prix quotidiens. Vous pouvez alors deviner quel est le comportement par défaut (c'est-à-dire
axis=0
) par rapport à ces données financières.axis=1
peut être simplement considéré comme «l'autre sens».Par exemple, les fonctions statistiques, telles que
mean()
,sum()
,describe()
,count()
tout défaut en colonne , car il est plus logique de les faire pour chaque stock.sort_index(by=)
prend également par défaut la colonne.fillna(method='ffill')
se remplira le long de la colonne car il s'agit du même stock.dropna()
par défaut à la ligne parce que vous voulez probablement juste jeter le prix ce jour-là au lieu de jeter tous les prix de ce stock.De même, l'indexation entre crochets fait référence aux colonnes, car il est plus courant de choisir un stock au lieu de choisir un jour.
la source
l'un des moyens faciles de mémoriser l'axe 1 (colonnes), par rapport à l'axe 0 (lignes) est la sortie que vous attendez.
la source
pd.concat
oudf.dropna()
, qui utilisent l'axe kewarg en plus d'une capacité d'identification.Le problème avec une utilisation
axis=
correcte est pour son utilisation dans 2 cas différents:L'idée principale derrière cette réponse est que pour éviter la confusion, nous sélectionnons soit un nombre , soit un nom pour spécifier l'axe particulier, selon le plus clair, le plus intuitif et le plus descriptif.
Pandas est basé sur NumPy, qui est basé sur les mathématiques, en particulier sur les matrices à n dimensions. Voici une image pour une utilisation courante des noms d'axes en mathématiques dans l'espace tridimensionnel:
Cette image sert uniquement à mémoriser les nombres ordinaux des axes :
0
pour l'axe x,1
pour l'axe y, et2
pour l'axe z.L' axe z est uniquement pour les panneaux ; pour les trames de données, nous limiterons notre intérêt au plan de base bidimensionnel de couleur verte avec l' axe x (
0
, vertical) et l' axe y (1
, horizontal).C'est tout pour les nombres comme valeurs potentielles de
axis=
paramètre.Les noms des axes sont
'index'
(vous pouvez utiliser l'alias'rows'
) et'columns'
, et pour cette explication, la relation entre ces noms et les nombres ordinaux (des axes) n'est PAS importante , car tout le monde sait ce que signifient les mots "lignes" et "colonnes" ( et tout le monde ici - je suppose - sait ce que signifie le mot "index" dans les pandas).Et maintenant, ma recommandation:
Si vous souhaitez calculer une valeur cumulée , vous pouvez la calculer à partir de valeurs situées le long de l'axe 0 (ou le long de l'axe 1 ) - utilisez
axis=0
(ouaxis=1
).De même, si vous souhaitez réorganiser les valeurs , utilisez le numéro d'axe de l'axe, le long duquel se trouvent les données pour le réarrangement (par exemple pour le tri ).
Si vous souhaitez manipuler (par exemple concaténer ) des entités (par exemple des cadres de données ) - utilisez
axis='index'
(synonyme :)axis='rows'
ouaxis='columns'
pour spécifier le changement résultant - index ( lignes ) ou colonnes , respectivement.(Pour concaténer , vous obtiendrez respectivement un index plus long (= plus de lignes) ou plus de colonnes .)
la source
Ceci est basé sur la réponse de @ Safak. La meilleure façon de comprendre les axes dans pandas / numpy est de créer un tableau 3D et de vérifier le résultat de la fonction somme le long des 3 axes différents.
un sera:
Maintenant, vérifiez la somme des éléments du tableau le long de chacun des axes:
vous donnera les résultats suivants:
la source
Je comprends de cette façon:
Supposons que si votre opération nécessite une traversée de gauche à droite / de droite à gauche dans une trame de données, vous fusionnez apparemment des colonnes, par exemple. vous opérez sur différentes colonnes. C'est axe = 1
Exemple
De même, si votre opération nécessite une traversée de haut en bas / de bas en haut dans une trame de données, vous fusionnez des lignes. Il s'agit de l' axe = 0 .
la source
axe = 0 signifie de haut en bas axe = 1 signifie de gauche à droite
L'exemple donné prend la somme de toutes les données de la colonne == clé.
la source
Ma pensée: Axe = n, où n = 0, 1, etc. signifie que la matrice est repliée (pliée) le long de cet axe. Ainsi, dans une matrice 2D, lorsque vous vous réduisez le long de 0 (lignes), vous opérez réellement sur une colonne à la fois. De même pour les matrices d'ordre supérieur.
Ce n'est pas la même chose que la référence normale à une dimension dans une matrice, où 0 -> ligne et 1 -> colonne. De même pour les autres dimensions d'un tableau de dimensions N.
la source
Je suis un débutant pour les pandas. Mais c'est ainsi que je comprends l'axe des pandas:
Direction variable constante de l' axe
0 ligne de colonne vers le bas |
Colonne à 1 rangée vers la droite ->
Donc, pour calculer la moyenne d'une colonne, cette colonne particulière doit être constante, mais les lignes en dessous peuvent changer (varier) donc c'est axe = 0.
De même, pour calculer la moyenne d'une ligne, cette ligne particulière est constante mais elle peut traverser différentes colonnes (variables) , axe = 1.
la source
Je pense qu'il y a une autre façon de le comprendre.
Pour un tableau np., Si nous voulons éliminer les colonnes, nous utilisons axis = 1; si nous voulons éliminer les lignes, nous utilisons axe = 0.
Pour un objet pandas,
axis = 0
signifie un fonctionnement en ligne et un fonctionnement enaxis = 1
colonne. Ceci est différent denumpy
par définition, nous pouvons vérifier les définitions de numpy.doc et pandas.docla source
J'éviterai explicitement d'utiliser «par ligne» ou «le long des colonnes», car les gens peuvent les interpréter exactement de la mauvaise façon.
L'analogie d'abord. Intuitivement, vous vous attendriez à ce que
pandas.DataFrame.drop(axis='column')
supprime une colonne de N colonnes et vous donne (N - 1) colonnes. Vous ne pouvez donc pas faire attention aux lignes pour l'instant (et supprimer le mot «ligne» de votre dictionnaire anglais.) Vice versa,drop(axis='row')
fonctionne sur les lignes.De la même manière,
sum(axis='column')
fonctionne sur plusieurs colonnes et vous donne 1 colonne. De même,sum(axis='row')
résultats sur 1 ligne. Ceci est cohérent avec sa forme de définition la plus simple, réduisant une liste de nombres à un seul nombre.En général, avec
axis=column
, vous voyez des colonnes, travaillez sur des colonnes et obtenez des colonnes. Oubliez les rangées.Avec
axis=row
, changez de perspective et travaillez sur les lignes.0 et 1 ne sont que des alias pour «ligne» et «colonne». C'est la convention de l'indexation matricielle.
la source
pd.concat
votre explication, cela ne fonctionne pas tout à fait. Pouvez-vous expliquer le comportement de concaténation avec les 2 axes s'il vous plaît? Merci.J'essaie également de comprendre l'axe depuis la dernière heure. La langue dans toutes les réponses ci-dessus, ainsi que la documentation ne sont pas du tout utiles.
Pour répondre à la question telle que je la comprends maintenant, dans Pandas, axis = 1 ou 0 signifie quels en - têtes d'axe voulez-vous garder constants lors de l'application de la fonction.
Remarque: quand je dis des en-têtes, je veux dire des noms d'index
Élargir votre exemple:
Pour axe = 1 = colonnes: nous gardons les en-têtes de colonnes constants et appliquons la fonction moyenne en modifiant les données. Pour démontrer, nous gardons les en-têtes de colonnes constants comme:
Maintenant, nous remplissons un ensemble de valeurs A et B, puis trouvons la moyenne
Ensuite, nous remplissons l'ensemble suivant de valeurs A et B et trouvons la moyenne
De même, pour axe = lignes, nous gardons les en-têtes de ligne constants et continuons de modifier les données: Pour démontrer, fixez d'abord les en-têtes de ligne:
Remplissez maintenant le premier ensemble de valeurs X et Y, puis trouvez la moyenne
Remplissez ensuite l'ensemble suivant de valeurs X et Y, puis trouvez la moyenne:
En résumé,
Lorsque axe = colonnes, vous fixez les en-têtes de colonne et modifiez les données, qui proviendront des différentes lignes.
Lorsque axe = lignes, vous corrigez les en-têtes de ligne et modifiez les données, qui proviendront des différentes colonnes.
la source
axe = 1, il donnera la ligne de somme sage, keepdims = True conservera la dimension 2D. J'espère que cela vous aide.
la source
Beaucoup de réponses ici m'ont beaucoup aidé!
Dans le cas où vous êtes confus par les différents comportements de
axis
Python etMARGIN
de R (comme dans laapply
fonction), vous pouvez trouver un article de blog que j'ai écrit d'intérêt: https://accio.github.io/programming/2020/05/ 19 / numpy-pandas-axis.html .En substance:
numpy
etpandas
, le paramètre d'axe en somme spécifie en fait numpy pour calculer la moyenne de toutes les valeurs qui peuvent être récupérées sous forme de tableau [0, 0, ..., i, ..., 0] où i itère à travers toutes les valeurs possibles. Le processus est répété avec la position de i fixe et les indices des autres dimensions varient l'un après l'autre (à partir de l'élément le plus à droite). Le résultat est un tableau à n-1 dimensions.apply
fonction de calculer la moyenne de toutes les valeurs pouvant être extraites sous la forme d'un tableau [, ..., i, ...,] où i parcourt toutes les valeurs possibles. Le processus n'est pas répété lorsque toutes les valeurs i ont été itérées. Par conséquent, le résultat est un simple vecteur.la source
Les tableaux sont conçus avec ce que l'on appelle l'axe = 0 et les lignes positionnées verticalement par rapport à l'axe = 1 et les colonnes positionnées horizontalement. L'axe fait référence à la dimension du tableau.
la source
axis=0
signifie que chaque ligne en bloc, nous ne pouvons manipuler DataFrame inter-ligne au lieu de ligne intérieure.axis=1
signifie que chaque colonne est un bloc, nous ne pouvons manipuler que l'inter-colonne DataFrame au lieu de la colonne intérieure.