简体   繁体   English

pandas使用新列名称作为字符串进行分配

[英]pandas assign with new column name as string

I recently discovered pandas "assign" method which I find very elegant. 我最近发现了大熊猫“分配”方法 ,我发现它非常优雅。 My issue is that the name of the new column is assigned as keyword, so it cannot have spaces or dashes in it. 我的问题是新列的名称被指定为关键字,因此它不能包含空格或破折号。

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

but what if I want to name the new column "ln(A)" for example? 但是如果我想将新列命名为“ln(A)”呢? Eg 例如

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

I know I could rename the column right after the .assign call, but I want to understand more about this method and its syntax. 我知道我可以在.assign调用之后立即重命名该列,但我想更多地了解这个方法及其语法。

You can pass the keyword arguments to assign as a dictionary, like so: 您可以传递关键字参数以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

assign expects a bunch of key word arguments. assign需要一堆关键字参数。 It will, in turn, assign columns with the names of the key words. 反过来,它将分配具有关键字名称的列。 That's handy, but you can't pass an expression as the key word. 这很方便,但你不能把表达作为关键词。 This is spelled out by @EdChum in the comments with this link @EdChum在此链接的评论中详细说明了这一点

use insert instead for inplace transformation 使用insert代替inplace转换

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

在此输入图像描述


use concat if you don't want inplace 如果你不想要就地使用concat

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

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM