2016-09-29 7 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

だけでなく、カッコがすぐVARのために違法な名前でメソッド呼び出しのいくつかの種類として扱います。 //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にキーワード引数を渡すことができます。https:

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は、キーワードの引数の束を期待しています。次に、列にキーワードの名前を割り当てます。それは便利ですが、式をキーワードとして渡すことはできません。あなたがインプレース

をしたくない場合はこれが、この link

インプレース変換の代わりに使用insert

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

enter image description here


使用concatとコメントで@EdChumによって綴られます

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

enter image description here

+0

あなたの答えをありがとう。 インサートがインプレースとしてしか動作しないため、動作に違いがあります – FLab

+0

@FLab投稿を更新しました – piRSquared

関連する問題