使用Python Pandas为DataFrame新增列失败,求排查指导
问题排查与解决建议
核心问题分析
你的代码存在几个关键错误导致无法正常运行:
- 赋值逻辑错误:
df = bls_data['study_id'] = bls_data['project_id'] + "_1"执行后,df接收的是新增的study_id列(Pandas Series对象),而非整个DataFrame。后续调用df.to_csv()时,Series的方法行为和DataFrame不一致,且会丢失原数据。 - 类型兼容问题:如果
project_id列是数值类型(int/float),直接和字符串"_1"拼接会触发类型错误,必须先将数值转为字符串。 - 目标文件夹未预创建:如果
07newcolumn文件夹不存在,写入文件时会抛出路径不存在的异常。 - 文件筛选不严谨:当前判断逻辑可能误处理非CSV文件(比如.txt),导致
pd.read_csv()读取失败。
修正后的代码
import pandas as pd from os import listdir, makedirs from os.path import isfile, join, exists # 提前创建目标文件夹,不存在则新建 target_dir = "07newcolumn" if not exists(target_dir): makedirs(target_dir) onlyfiles = [f for f in listdir('.') if isfile(join('.', f))] print(onlyfiles) # 新增列处理逻辑 for file in onlyfiles: # 只处理CSV文件,排除隐藏文件和ipynb文件 if file[:1] != '.' and file.endswith('.csv') and not file.endswith('ipynb'): print(file) bls_data = pd.read_csv(file) # 先将project_id转为字符串,再拼接避免类型错误 bls_data['study_id'] = bls_data['project_id'].astype(str) + "_1" # 用原DataFrame保存,修正文件名生成逻辑 output_filename = f"{target_dir}/{file.replace('.csv', '_vF.csv')}" bls_data.to_csv(output_filename, index=True)
关键修改说明
- 新增文件夹创建逻辑:用
makedirs确保目标目录存在,避免写入失败。 - 修正赋值逻辑:直接在原DataFrame
bls_data上新增列,不再错误赋值给df。 - 类型转换:通过
astype(str)将project_id转为字符串,保证拼接操作合法。 - 严谨的文件筛选:明确只处理
.csv文件,避免读取非CSV格式文件报错。 - 更安全的文件名处理:用
replace('.csv', '_vF.csv')替换后缀,比固定截取[:-5]更可靠(比如应对文件名含多个点的情况)。
内容的提问来源于stack exchange,提问作者abby
相关产品推荐
相关产品推荐

