2017-09-06 3 views
0

J'essaie de générer une nouvelle colonne dans une base de données qui est égale à l'index des lignes actuelles moins l'index de la ligne sélectionnée à l'origine par un utilisateur. Disons que nous avons ce dataframe:Pandas dataframe appliquer une fonction pour créer une nouvelle colonne basée sur la ligne sélectionnée

 A B C 
0 foo bar 
1 bar foo 
2 foo bar 

et notre utilisateur a sélectionné la ligne 1. Je veux que les valeurs de la colonne C pour être ceci:

A B C 
0 foo bar -1 
1 bar foo 0 
2 foo bar 1 

Je sais déjà ce genre de peut être mis en œuvre par itérer à travers la trame de données en utilisant quelque chose comme ceci:

for index,row in df.iterrows(): 
    df['C'].loc[index] = index - USER_SELECTED_INDEX 

mais c'est très lent. Si lent en fait que ça ne marche pas.

Ma question est, comment puis-je utiliser df.apply pour accélérer les choses? Et comment puis-je passer l'index de la ligne actuelle à ma fonction qui est appliquée? Je veux faire quelque chose comme:

def applyCol(index): 
    df['C'].loc[index] = index - USER_SELECTED_INDEX 

df['C'] = df.apply(applyCol, axis=1) 

Répondre

0

J'ai trouvé la réponse que je recherchais. Pour les personnes intéressées:

def applyCol(row): 
    return row.name - USER_SELECTED_INDEX #row.name resolves to the index 

df['C'] = df.apply(applyCol, axis=1) 

Bonne programmation!

2

Peut-être essayer.

df.assign(C=df.index-1) 
Out[28]: 
    A B C 
0 foo bar -1 
1 bar foo 0 
2 foo bar 1