552 votes

Comment appliquer une fonction à deux colonnes d'un cadre de données Pandas ?

Supposons que j'ai un df qui a des colonnes de 'ID', 'col_1', 'col_2' . Et je définis une fonction :

f = lambda x, y : my_function_expression .

Maintenant, je veux appliquer le f à df Les deux colonnes de l'article 'col_1', 'col_2' pour calculer par éléments une nouvelle colonne 'col_3' , un peu comme :

df['col_3'] = df[['col_1','col_2']].apply(f)  
# Pandas gives : TypeError: ('<lambda>() takes exactly 2 arguments (1 given)'

Comment faire ?

** Ajouter un échantillon détaillé comme ci-dessous ***

import pandas as pd

df = pd.DataFrame({'ID':['1','2','3'], 'col_1': [0,2,3], 'col_2':[1,4,5]})
mylist = ['a','b','c','d','e','f']

def get_sublist(sta,end):
    return mylist[sta:end+1]

#df['col_3'] = df[['col_1','col_2']].apply(get_sublist,axis=1)
# expect above to output df as below 

  ID  col_1  col_2            col_3
0  1      0      1       ['a', 'b']
1  2      2      4  ['c', 'd', 'e']
2  3      3      5  ['d', 'e', 'f']

4 votes

pouvez-vous appliquer f directement aux colonnes : df['col_3'] = f(df['col_1'],df['col_2'])

1 votes

Il serait utile de savoir ce que f fait

2 votes

non, df['col_3'] = f(df['col_1'],df['col_2']) ne fonctionne pas. Car f n'accepte que les entrées scalaires, pas les entrées vectorielles. OK, vous pouvez supposer que f = lambda x,y : x+y . (bien sûr, mon f réel n'est pas aussi simple, sinon je peux directement df['col_3'] = df['col_1'] + df['col_2'] )

12voto

Nitin Points 323

La façon dont vous avez écrit f nécessite deux entrées. Si vous regardez le message d'erreur, il indique que vous ne fournissez pas deux entrées à f, mais une seule. Le message d'erreur est correct.
Le décalage est dû au fait que df[['col1', 'col2']] renvoie un seul cadre de données avec deux colonnes, et non deux colonnes distinctes.

Vous devez modifier votre f pour qu'il prenne une seule entrée, garder le cadre de données ci-dessus comme entrée, puis le décomposer en x,y à l'intérieur de le corps de la fonction. Ensuite, faites ce dont vous avez besoin et renvoyez une seule valeur.

Vous avez besoin de cette signature de fonction parce que la syntaxe est .apply(f) Ainsi, f doit prendre une seule chose = dataframe et non deux choses, ce qui est ce que votre f actuel attend.

Comme vous n'avez pas fourni le corps de f, je ne peux pas vous aider plus en détail - mais cela devrait vous permettre de vous en sortir sans changer fondamentalement votre code ou en utilisant d'autres méthodes plutôt que d'appliquer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X