使用pandas assign链式调用创建新列报错:file_path未定义
问题解决:Pandas链式调用assign创建新列的正确方式
错误原因
你在assign里直接写file_path会被Python解释为全局变量,而非当前链式调用中DataFrame的列,因此触发name 'file_path' is not defined错误。
修正后的代码
( pd.pivot(test, index=['file_path'], columns='year', values='file') .fillna(0) .astype(int) .reset_index() # 用lambda引用当前DataFrame,通过参数访问列 .assign(hierarchy=lambda df: df['file_path'].str.split('\\').str[1:-1].str.join(' > ')) )
关键说明
- 引用当前DataFrame:在链式调用的
assign方法中,必须通过lambda表达式接收当前DataFrame(示例中用df作为参数),再通过df['列名']的方式访问已有列。 - 路径层级处理修正:你原代码中
file_path.str[1:-1]是对字符串本身做字符切片,无法正确拆分路径层级。需要先用str.split('\\')将Windows路径按反斜杠分割为列表,再对列表切片str[1:-1]提取中间层级,最后用str.join(' > ')拼接成目标格式。
修正后示例输出
处理后的DataFrame会新增hierarchy列,效果如下:
| file_path | 2017 | 2018 | 2019 | 2020 | hierarchy |
|---|---|---|---|---|---|
| S:\Test\A | 0 | 0 | 1 | 2 | Test |
| S:\Test\A\B | 1 | 0 | 1 | 3 | Test > A |
| S:\Test\A\C | 3 | 1 | 1 | 0 | Test > A |
| S:\Test\B\A | 1 | 0 | 0 | 1 | Test |
| S:\Test\B\B | 1 | 0 | 0 | 1 | Test |
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

