web-dev-qa-db-ja.com

pandas新しい列名を文字列として割り当てる

最近発見したpandas "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呼び出しの直後に列の名前を変更できることは知っていますが、このメソッドとその構文についてさらに理解したいと思います。

31
FLab

以下のように、キーワード引数を辞書として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
47
Piotr

assignは、一連の主要なWord引数を想定しています。次に、キーワードの名前を列に割り当てます。これは便利ですが、式をキーワードとして渡すことはできません。これは、コメントに@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

6
piRSquared