J'essaie d'accéder à l'index d'une ligne dans une fonction appliquée sur tout un DataFrame
dans Pandas. J'ai quelque chose comme ça:
df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
a b c
0 1 2 3
1 4 5 6
et je définirai une fonction qui accède aux éléments avec une ligne donnée
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Je peux l'appliquer comme ceci:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
Impressionnant! Maintenant, que faire si je veux incorporer l'index dans ma fonction? L'index de n'importe quelle ligne donnée dans ceci DataFrame
avant l'ajout d
seraitIndex([u'a', u'b', u'c', u'd'], dtype='object')
, mais je veux le 0 et 1. Donc je ne peux pas simplement accéder row.index
.
Je sais que je pourrais créer une colonne temporaire dans la table où je stocke l'index, mais je me demande si elle est stockée quelque part dans l'objet de ligne.
apply
? C'est beaucoup plus lent que d'effectuer des opérations vectorisées sur l'image elle-même. (Parfois, appliquer est le moyen le plus simple de faire quelque chose, et les considérations de performances sont souvent exagérées, mais pour votre exemple particulier, il est aussi facile de ne pas l'utiliser.)Réponses:
Pour accéder à l'index dans ce cas, vous accédez à l'
name
attribut:Notez que si c'est vraiment ce que vous essayez de faire, ce qui suit fonctionne et est beaucoup plus rapide:
ÉDITER
En regardant cette question 3+ ans plus tard, vous pouvez simplement faire:
mais en supposant que ce ne soit pas aussi simple que cela, quoi que vous
rowFunc
fassiez vraiment, vous devriez chercher à utiliser les fonctions vectorisées, puis les utiliser contre l'index df:la source
name
serait un tuple nommé dans le cas d'unMultindex
, de sorte qu'un niveau d'index spécifique puisse être interrogé par son nom.Soit:
1. à l'
row.name
intérieur de l'apply(..., axis=1)
appel:2. avec
iterrows()
(plus lent)DataFrame.iterrows () vous permet d'itérer sur les lignes et d'accéder à leur index:
la source
Pour répondre à la question d'origine: oui, vous pouvez accéder à la valeur d'index d'une ligne dans
apply()
. Il est disponible sous la cléname
et nécessite que vous spécifiiezaxis=1
(car le lambda traite les colonnes d'une ligne et non les lignes d'une colonne).Exemple de travail (pandas 0.23.4):
la source