【问题标题】:pandas assign with new column name as string熊猫将新列名分配为字符串
【发布时间】:2017-02-07 15:02:50
【问题描述】:

我最近发现了 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 调用之后立即重命名该列,但我想了解有关此方法及其语法的更多信息。

【问题讨论】:

  • 那么括号立即将其视为某种方法调用,这是 var 的非法名称:docs.python.org/3.2/reference/lexical_analysis.html#identifiers
  • 从上面的例子中,我仍然可以做 df['log(A)'] = df.sum(axis = 1),但我明白为什么我会得到上面的错误(这是有点意料之中的) )
  • 但是 df['log(A)'] 是一个 str 变量名规则不适用

标签: python pandas assign columnname


【解决方案1】:

assign 需要一堆关键字参数。反过来,它将为列分配关键字的名称。这很方便,但您不能将表达式作为关键字传递。 @EdChum 在 cmets 中用 link 说明了这一点

使用insert 代替就地转换

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


如果你不想就地使用concat

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

【讨论】:

  • 感谢您的回答。行为有所不同,因为插入仅在原地作用
【解决方案2】:

您可以将关键字参数作为字典传递给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

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2015-04-14
    • 2017-09-05
    • 2022-09-23
    • 2017-11-17
    • 2018-10-21
    • 2019-01-27
    • 2020-04-04
    相关资源
    最近更新 更多