web-dev-qa-db-fra.com

pandas assign avec le nouveau nom de colonne comme chaîne

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.

31
FLab

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
47
Piotr

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

enter image description here


utilisez concat si vous ne voulez pas en place

pd.concat([df, np.log(df.A).rename('log(A)')], axis=1)

enter image description here

6
piRSquared