Python使用pandas筛选DataFrame指定列报TypeError错误如何解决?
核心报错原因
你代码中通过列表推导式生成的df是存储了多个DataFrame的Python列表,并非单个合并后的DataFrame对象,列表只能用整数/切片索引,不能直接传入列名/列索引列表做筛选,报错和列值为浮点型没有关联。
实现代码
分两种常用场景,按需选择即可:
场景1:所有CSV合并为单个文件导出
import os, glob import pandas as pd # 基础配置 work_dir = r'C:\Documents\test' # 两种列筛选方式二选一 # 方式A:按列名筛选 col_to_keep = ['Name', 'ID', 'Area', 'Length'] # 方式B:按列索引筛选(索引从0开始计数) # col_to_keep = [3,5,7,9] combined_df = pd.DataFrame() # 遍历所有csv文件 for csv_file in glob.glob(os.path.join(work_dir, '*.csv')): # 读取时直接筛选需要的列,降低内存占用 temp = pd.read_csv( csv_file, delimiter=';', error_bad_lines=False, usecols=col_to_keep ) # 合并到总表 combined_df = pd.concat([combined_df, temp], ignore_index=True) # 导出合并后的结果到Excel combined_df.to_excel(os.path.join(work_dir, '合并结果.xlsx'), index=False)
场景2:每个CSV单独处理、单独导出
import os, glob import pandas as pd # 基础配置 work_dir = r'C:\Documents\test' # 两种列筛选方式二选一 col_to_keep = ['Name', 'ID', 'Area', 'Length'] # col_to_keep = [3,5,7,9] for csv_file in glob.glob(os.path.join(work_dir, '*.csv')): temp = pd.read_csv( csv_file, delimiter=';', error_bad_lines=False, usecols=col_to_keep ) # 生成对应Excel文件名 file_name = os.path.splitext(os.path.basename(csv_file))[0] + '.xlsx' temp.to_excel(os.path.join(work_dir, file_name), index=False)
注意事项
- 优先使用
pd.read_csv的usecols参数直接筛选列,无需读取全部28列后再做裁剪,内存效率更高 - 如果你需要先读取全量列再筛选,语法为
单个DataFrame对象[col_to_keep],确保操作对象是DataFrame而非列表 - 使用列索引筛选时,注意索引从0开始计数,不要超过csv实际的列数范围
内容的提问来源于stack exchange,提问作者rcheeks23
相关产品推荐
相关产品推荐

