obtenir l’index d’une ligne dans une fonction de pandas applique

J’essaie d’accéder à l’index d’une ligne dans une fonction appliquée à l’intégralité d’un DataFrame dans Pandas. J’ai quelque chose comme ceci:

 df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) >>> df abc 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 ça:

 df['d'] = df.apply(rowFunc, axis=1) >>> df abcd 0 1 2 3 7 1 4 5 6 34 

Impressionnant! Maintenant, si je veux incorporer l’index dans ma fonction? L’index de toute ligne donnée dans ce DataFrame avant l’ajout de d serait Index([u'a', u'b', u'c', u'd'], dtype='object') , mais je veux le 0 et 1. Je ne peux donc pas 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 se trouve quelque part dans l’object ligne.

Pour accéder à l’index dans ce cas, vous accédez à l’atsortingbut name :

 In [182]: df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) def rowFunc(row): return row['a'] + row['b'] * row['c'] def rowIndex(row): return row.name df['d'] = df.apply(rowFunc, axis=1) df['rowIndex'] = df.apply(rowIndex, axis=1) df Out[182]: abcd rowIndex 0 1 2 3 7 0 1 4 5 6 34 1 

Notez que si c’est vraiment ce que vous essayez de faire, les choses suivantes fonctionnent et sont beaucoup plus rapides:

 In [198]: df['d'] = df['a'] + df['b'] * df['c'] df Out[198]: abcd 0 1 2 3 7 1 4 5 6 34 In [199]: %timeit df['a'] + df['b'] * df['c'] %timeit df.apply(rowIndex, axis=1) 10000 loops, best of 3: 163 µs per loop 1000 loops, best of 3: 286 µs per loop 

MODIFIER

En regardant cette question plus de 3 ans plus tard, vous pourriez simplement faire:

 In[15]: df['d'],df['rowIndex'] = df['a'] + df['b'] * df['c'], df.index df Out[15]: abcd rowIndex 0 1 2 3 7 0 1 4 5 6 34 1 

mais en supposant que ce ne soit pas aussi sortingvial que cela, quoi que rowFunc vraiment rowFunc , vous devriez chercher à utiliser les fonctions vectorisées, puis les utiliser avec l’index df:

 In[16]: df['newCol'] = df['a'] + df['b'] + df['c'] + df.index df Out[16]: abcd rowIndex newCol 0 1 2 3 7 0 6 1 4 5 6 34 1 16 

apply() n’est pas le droïde que vous recherchez.

DataFrame.iterrows () vous permet de parcourir les lignes et d’accéder à leur nom:

 for name, row in df.iterrows(): ...