2015-12-07 2 views
2

J'essaie de créer une fonction qui parcourt une trame de données pandas ligne par ligne. Je veux créer une nouvelle colonne basée sur les valeurs de ligne des autres colonnes. Mon dataframe d'origine pourrait ressembler à ceci:Comment créer une nouvelle colonne et insérer des valeurs de lignes lors de l'itération via la trame de données pandas

df: 

    A B 
0 1 2 
1 3 4 
2 2 2 

Maintenant, je veux créer une nouvelle colonne remplie avec les valeurs de la ligne de la colonne A - Colonne B à chaque position d'index, de sorte que le résultat ressemble à ceci:

df: 

     A B A-B 
    0 1 2 -1 
    1 3 4 -1 
    2 2 2 0 

la solution je fonctionne, mais seulement quand je ne l'utilise pas dans une fonction:

for index, row in df.iterrows(): 
     print index 
     df['A-B']=df['A']-df['B'] 

Cela me donne la sortie désirée, mais lorsque je tente de l'utiliser en fonction, je reçois un Erreur. Qu'est-ce que je fais mal ici et comment puis-je le faire fonctionner?

+0

avez-vous besoin que la colonne Soustraire les uns des autres ou il est juste un exemple simple? –

+0

J'ai vraiment besoin d'une nouvelle colonne contenant les résultats de la colonne A moins la colonne B –

Répondre

1

C'est parce que la méthode apply fonctionne pour la colonne par défaut, changer axis-1 si vous souhaitez par rangées:

axe: {0 ou 'index', 1 ou 'colonnes'}, par défaut 0

  • 0 ou 'index': appliquer la fonction de chaque colonne
  • 1 ou 'colonnes': appliquer la fonction de chaque rangée
df.apply(test, axis=1) 

EDIT

Je pensais que vous devez faire quelque chose manupulation complexe avec chaque ligne. Si vous avez juste besoin de colonnes Soustraire de l'autre:

df['A-B'] = df.A - df.B 
+0

Cela a du sens, merci. Je reçois toujours la même erreur, même si cela semble fonctionner de toute façon ... –

+0

pour moi cela fonctionne dans les deux sens avec 'axis = 1' et' axis = 0' quelle version de 'pandas 'utilisez-vous? –

+0

J'utilise la version 0.17.0 –

2

Comme indiqué par Anton vous devez exécuter la fonction apply avec le paramètre axis=1. Cependant, il n'est pas nécessaire de boucler puis à travers les lignes que vous avez fait dans le test de fonctionnement, puisque les apply documentation mentions:

objets passés aux fonctions sont des objets Série

Ainsi, vous pouvez simplifier la fonction à:

def test(x): 
    x['A-B']=x['A']-x['B'] 
    return x 

puis exécutez:

df.apply(test,axis=1) 

Notez que, en fait, vous avez nommé le paramètre du test x, tout en n'utilisant pas du tout x dans la fonction test.

Enfin, je devrais ajouter que vous pouvez faire des opérations de colonne avec des pandas (c.-à-d.sans boucle) faisant simplement ceci:

df['A-B']=df['A']-df['B'] 

Voir aussi:

+0

Merci, je ne savais pas que la création de ne nouvelle colonne était possible sans la boucle for-! –

+0

En fait, c'est une nouvelle question. Mais, déjà demandé avant: http://stackoverflow.com/questions/18472634/how-to-compute-a-new-column-based-on-the-values-of-other-columns-in-pandas-pyt – agold