如何从字符串列表创建DataFrame?Pandas读取CSV遇整数要求异常
从制表符分隔的字符串列表创建Pandas DataFrame
背景信息
- 样本文件:纯文本格式,内容以制表符分隔
- 手动读取代码(已修正原代码变量名错误):
f = open("test.txt") data_list = [] for l in f.readlines(): data_extract = l.strip().split("\t") data_list.append(data_extract) print(data_extract) f.close()
- 读取后的输出(共4行:列名行、单位行、两行数据):
[ ['Fy', 'Fz', 'Mz', 'FLPt', 'IEPt', 'APPt', 'VP', 'Cal', 'VLAt', 'FLAt', 'IEAt', 'APAt', 'AbAt', 'NA', 'NA', 'NA', 'VLSp', 'FLSp', 'IESp', 'APSp', 'VLWf', 'FLWf', 'IEWf', 'APWf', 'VLSm', 'FLSm', 'IESm', 'APSm', 'Fx 1', 'Fy 1', 'Fz 1', 'Mx 1', 'My 1', 'Mz 1', 'VPS1', 'SP11', 'SP12', 'Spc1', 'SP13', 'SP14', 'SP15', 'Fld1', 'Station'], ['N', 'N', 'N-m', 'deg', 'deg', 'mm', 'N', 'N', 'Volts', 'Volts', 'Volts', 'Volts', 'NA', 'NA', 'NA', 'NA', 'N', 'deg', 'deg', 'mm', 'N', 'deg', 'deg', 'mm', 'N', 'deg', 'deg', 'mm', 'N', 'N', 'N', 'N-m', 'N-m', 'N-m', 'mm', 'NA', 'N', '°C', 'NA', 'NA', 'N-m', 'Volts', 'N'], ['65.782', '656.083', '-1.985', ' 0.232', '-1.858', ' 1.685', '535.965', '-6.990', ' 2.227', ' 0.975', '-0.330', '-0.179', '4063.000', '23.000', '-1021.000', '1132.000', ' 0.000', ' 0.000', ' 0.000', ' 0.000', '595.840', ' 0.153', '-1.870', ' 1.758', '535.965', ' 0.232', '-1.858', ' 1.685', '-12.522', '64.476', '665.416', '12.400', ' 0.472', '-1.933', '13.181', '-0.240', '15.304', '-35.972', '-0.067', '-0.098', '-0.134', ' 2.847', ' 1.000'], ['67.502', '703.480', '-2.060', ' 0.237', '-1.870', ' 1.682', '568.867', '-6.990', ' 2.310', ' 1.031', '-0.318', '-0.197', '4575.000', '30.000', '-1026.000', '1123.000', ' 0.000', ' 0.000', ' 0.000', ' 0.000', '670.888', ' 0.195', '-1.879', ' 1.744', '568.867', ' 0.237', '-1.870', ' 1.682', '-11.537', '66.749', '713.655', '13.856', ' 0.220', '-2.297', '13.184', '-0.135', '15.918', '-35.972', '-0.075', '-0.094', '-0.203', ' 2.847', ' 1.000'] ]
解决方法
方法1:直接用Pandas读取文件(推荐)
文件是制表符分隔格式,用pd.read_csv处理更高效,同时适配两行表头的结构:
- 忽略单位行,仅用第一行做列名:
import pandas as pd # sep指定制表符分隔,skiprows跳过第二行(单位行) df = pd.read_csv("test.txt", sep="\t", skiprows=[1]) # 可选:将所有数据列转为数值类型 df = df.apply(pd.to_numeric, errors="ignore")
- 保留单位信息,合并列名与单位:
import pandas as pd # 读取前两行作为列名和单位 with open("test.txt", "r") as f: col_names = f.readline().strip().split("\t") units = f.readline().strip().split("\t") # 合并列名和单位,生成类似"Fy (N)"的复合列名 combined_cols = [f"{name} ({unit})" for name, unit in zip(col_names, units)] # 读取剩余数据,用合并后的列名 df = pd.read_csv("test.txt", sep="\t", skiprows=[0,1], names=combined_cols) df = df.apply(pd.to_numeric, errors="ignore")
方法2:从已读取的字符串列表创建DataFrame
如果已经手动读取到了data_list(即上述4行列表),可以直接转换:
- 忽略单位行:
import pandas as pd # 用第一行做列名,从第三行开始作为数据 df = pd.DataFrame(data_list[2:], columns=data_list[0]) df = df.apply(pd.to_numeric, errors="ignore")
- 保留单位信息:
import pandas as pd # 合并列名和单位 combined_cols = [f"{col} ({unit})" for col, unit in zip(data_list[0], data_list[1])] # 从第三行开始作为数据 df = pd.DataFrame(data_list[2:], columns=combined_cols) df = df.apply(pd.to_numeric, errors="ignore")
原代码问题说明
原代码存在变量名不一致错误:df = open("test.txt")但后续调用f.readlines(),需改为f = open("test.txt");同时建议将读取的行存入列表,方便后续处理。
内容的提问来源于stack exchange,提问作者user18152330
相关产品推荐
相关产品推荐

