2016-09-29 11 views
18

Ich entdeckte vor kurzem Pandas "assign" method, die ich sehr elegant finde. Mein Problem ist, dass der Name der neuen Spalte als Schlüsselwort zugewiesen ist, also keine Leerzeichen oder Bindestriche enthalten darf.Pandas zuweisen mit neuen Spaltennamen als String

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 

aber was, wenn ich die neue Spalte "ln (A)" zum Beispiel benennen möchte? Zum Beispiel

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 

Ich weiß, ich könnte die Spalte direkt nach dem .assign Anruf umbenennen, aber ich möchte mehr über diese Methode und ihre Syntax verstehen.

+0

auch die Klammern sofort diesen Aufruf als eine Art Methode behandeln, die ein illegaler Name für eine var ist: https: //docs.python.org/3.2/reference/lexical_analysis.html#identifiers – EdChum

+0

Aus dem obigen Beispiel kann ich immer noch tun df ['log (A)'] = df.sum (Achse = 1), aber ich verstehe warum Ich bekomme den Fehler oben (es wurde etwas erwartet) – FLab

+0

aber 'df ['log (A)']' ist ein 'str', für den die Variablennamen Regeln nicht gelten – EdChum

Antwort

24

Sie können die Keyword-Argumente assign als Wörterbuch übergeben, etwa so:

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 
3

assign erwartet eine Reihe von Schlüsselwortargumenten. Es wird wiederum Spalten mit den Namen der Schlüsselwörter zuordnen. Das ist praktisch, aber Sie können keinen Ausdruck als Schlüsselwort übergeben. Dies wird durch @EdChum in den Kommentaren formulierte mit diesem link

Verwendung insert statt für Inplace Transformation

df.insert(2, 'ln(A)', np.log(df.A)) 
df 

enter image description here


Verwendung concat wenn Sie nicht wollen, Inplace

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

enter image description here

+0

Vielen Dank für Ihre Antwort. Es gibt einen Unterschied im Verhalten, da die Einfügung nur inplace wirkt – FLab

+0

@FLab Ich habe Post aktualisiert – piRSquared

Verwandte Themen