J'ai récemment découvert pandas méthode "assign" que je trouve très élégant. Mon problème est que le nom de la nouvelle colonne est assigné comme mot-clé, donc elle ne peut pas avoir d'espaces ou des tirets dedans.
df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)})
df.assign(ln_A = lambda x: np.log(x.A))
A B ln_A
0 1 0.426905 0.000000
1 2 -0.780949 0.693147
2 3 -0.418711 1.098612
3 4 -0.269708 1.386294
4 5 -0.274002 1.609438
5 6 -0.500792 1.791759
6 7 1.649697 1.945910
7 8 -1.495604 2.079442
8 9 0.549296 2.197225
9 10 -0.758542 2.302585
mais que faire si je veux nommer la nouvelle colonne "ln (A)" par exemple? Par exemple.
df.assign(ln(A) = lambda x: np.log(x.A))
df.assign("ln(A)" = lambda x: np.log(x.A))
File "<ipython-input-7-de0da86dce68>", line 1
df.assign(ln(A) = lambda x: np.log(x.A))
SyntaxError: keyword can't be an expression
Je sais que je pourrais renommer la colonne juste après l'appel .assign, mais je veux en savoir plus sur cette méthode et sa syntaxe.
Vous pouvez passer les arguments du mot clé à assign
comme un dictionnaire, comme ceci:
kwargs = {"ln(A)" : lambda x: np.log(x.A)}
df.assign(**kwargs)
A B ln(A)
0 1 0.500033 0.000000
1 2 -0.392229 0.693147
2 3 0.385512 1.098612
3 4 -0.029816 1.386294
4 5 -2.386748 1.609438
5 6 -1.828487 1.791759
6 7 0.096117 1.945910
7 8 -2.867469 2.079442
8 9 -0.731787 2.197225
9 10 -0.686110 2.302585
assign
attend un tas d'arguments clés de Word. Il attribuera à son tour des colonnes avec les noms des mots clés. C'est pratique, mais vous ne pouvez pas passer une expression comme mot clé. Ceci est expliqué par @EdChum dans les commentaires avec ce lien
utilisez insert
à la place pour la transformation in situ
df.insert(2, 'ln(A)', np.log(df.A))
df
utilisez concat
si vous ne voulez pas en place
pd.concat([df, np.log(df.A).rename('log(A)')], axis=1)