如何在Python中从首元素为列名的列表创建单列DataFrame
解决单列DataFrame创建时的TypeError问题
你的报错原因很明确:pd.DataFrame.from_records的columns参数要求传入可迭代的集合(比如列表、元组),但你直接传了单个字符串'sv_m1',pandas无法将其识别为列名集合,所以抛出了TypeError。
另外先提个小细节:你的CSV数据分隔符是空格,不是代码里写的逗号,这个先修正,否则读取的列数据会完全错误。
基础修正方案
先给你解决报错的最简修正代码:
import csv import pandas as pd # 注意分隔符改成空格,适配你的数据格式 input_file = open('df_seg_sample.csv', 'r') c_reader = csv.reader(input_file, delimiter=' ') # 提取第1列数据(索引从0开始) column = [x[1] for x in c_reader] label = column[0] column_values = column[1:] # 核心修改:把列名放到列表里传给columns参数 df_column = pd.DataFrame(data=column_values, columns=[label]) # 可选:将列值转换为数值类型(默认是字符串) df_column[label] = pd.to_numeric(df_column[label]) input_file.close()
针对超大文件的内存优化方案
考虑到你提到原数据量极大,直接把整列数据加载到内存可能撑不住,这里给你一个逐行读取+分批写入的优化版本,避免内存堆积:
import csv import pandas as pd def process_single_column(col_index, input_path, output_path, batch_size=10000): """ 逐列处理超大CSV文件,分批写入单列DataFrame到新文件 :param col_index: 要提取的列索引(从0开始) :param input_path: 原始CSV路径 :param output_path: 输出单列CSV路径 :param batch_size: 每批处理的行数,可根据内存调整 """ column_data = [] label = None with open(input_path, 'r') as input_file: c_reader = csv.reader(input_file, delimiter=' ') for idx, row in enumerate(c_reader): if idx == 0: # 提取列名 label = row[col_index] else: # 提前转换数值类型,减少内存占用(如果是数值的话) try: val = float(row[col_index]) column_data.append(val) except ValueError: # 非数值类型直接保留原字符串 column_data.append(row[col_index]) # 达到批处理阈值就写入文件,清空临时列表 if len(column_data) >= batch_size and idx != 0: df_batch = pd.DataFrame(column_data, columns=[label]) # 第一次写入带表头,后续追加不带表头 write_mode = 'w' if idx == batch_size else 'a' df_batch.to_csv(output_path, mode=write_mode, header=(write_mode=='w'), index=False) column_data = [] # 处理最后一批剩余的数据 if column_data: df_batch = pd.DataFrame(column_data, columns=[label]) df_batch.to_csv(output_path, mode='a', header=False, index=False) # 示例:提取第1列(对应sv_m1)并写入新文件 process_single_column(1, 'df_seg_sample.csv', 'sv_m1_output.csv')
这个方案的优势在于:
- 用
with语句自动管理文件,避免资源泄漏 - 逐行处理数据,不会一次性加载整个文件到内存
- 分批写入磁盘,内存占用始终保持在
batch_size对应的量级 - 提前转换数据类型,避免存储大量冗余字符串
内容的提问来源于stack exchange,提问作者Shuvayan Das
相关产品推荐
相关产品推荐

