使用Pandas assign方法时,f-string作列名报错:keyword can't be an expression
Pandas用assign动态指定列名的解决办法
常规加列操作
平时给DataFrame添加固定名称的新列,用assign可以这么写:
import pandas as pd df_so = pd.DataFrame.from_dict({0: 'jane', 1: 'baz', 2: 'baz', 3: 'dave', 4: 'dave', 5: 'dave'},orient='index',columns=["name"]) # 添加名为val的列,值全为bar df_so.assign(val="bar")
执行后得到的结果:
| index | name | val |
|---|---|---|
| 0 | jane | bar |
| 1 | baz | bar |
| 2 | baz | bar |
| 3 | dave | bar |
| 4 | dave | bar |
| 5 | dave | bar |
碰到的问题
但如果想动态生成列名,比如用f-string拼出来,直接写会报错:
an_other = "another" # 这么写会触发语法错误 df_so.assign(f"{an_other}_val"="bar") # 错误提示:SyntaxError: keyword can't be an expression
这是因为Python不允许把表达式直接当关键字参数名用。
解决办法
用字典解包就能搞定,把动态列名和对应值放进字典,再用**把字典拆成assign的参数:
方式一:直接传解包后的字典
an_other = "another" df_so.assign(**{f"{an_other}_val": "bar"})
方式二:先定义字典再传入(适合多列场景)
如果要加多个动态列,先把列名和值整理进字典更清晰:
an_other = "another" new_columns = { f"{an_other}_val": "bar", f"{an_other}_count": 3 } df_so.assign(**new_columns)
这样就能顺利生成another_val这类动态名称的列,还能继续用assign方法。
内容的提问来源于stack exchange,提问作者nipy
相关产品推荐
相关产品推荐

