2016-09-29 88 views
18

我最近發現了熊貓"assign" method,我覺得它很優雅。 我的問題是,新列的名稱被分配爲關鍵字,所以它不能有空格或破折號。熊貓指定新的列名作爲字符串

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 

但是,如果我想命名新列「ln(A)」,例如? 例如

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 

我知道我可以在.assign調用後重命名列,但我想更多地瞭解這個方法及其語法。

+0

以及括號立即將此視爲某種方法調用的這是一個變種非法的名字:HTTPS: //docs.python.org/3.2/reference/lexical_analysis.html#identifiers – EdChum

+0

從上面的例子,我仍然可以做df ['log(A)'] = df.sum(axis = 1),但我明白爲什麼我得到上面的錯誤(有點期待) – FLab

+0

,但'df ['log(A)']'是一個'str',變量名稱規則不適用 – EdChum

回答

24

您可以通過關鍵字參數assign一個字典,像這樣:

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需要一堆關鍵字參數。它會依次爲列分配關鍵詞的名稱。這很方便,但是你無法傳遞一個表達式作爲關鍵詞。這是通過@EdChum與此link

使用insert的評論闡述了而不是爲就地轉化

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

enter image description here


使用concat如果你不想就地

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

enter image description here

+0

感謝您的回答。 有行爲上的差異,因爲只插入行爲 – FLab

+0

@FLab我已更新帖子 – piRSquared