使用Pandas将TXT转CSV后转NumPy数组绘图遇类型转换错误求助
解决字符串转float失败的问题,附多文件合并绘图方案
看起来你在处理文本转CSV/Excel并绘图时遇到了字符串转float的报错,我帮你分析下原因并给出几个实用解决方案:
错误原因分析
你遇到的ValueError: could not convert string to float: 主要来自两个细节问题:
- 你的
M1.to_csv('M1.csv')默认会写入Pandas的索引列(就是CSV里第一列的0,1,2,...),同时CSV还包含表头行,用csv.reader读取时会把这些非数值内容读进来,转float自然失败。 - 其实你完全没必要绕弯用
csv.reader+numpy处理,Pandas本身就能直接搞定数值转换和后续的合并、绘图,效率更高也更省心。
方案1:修正现有代码(保留csv.reader+numpy流程)
如果一定要沿用你原来的代码结构,只要调整两个小地方:保存CSV时不写索引,读取时跳过表头:
import pandas as pd import os from matplotlib import pyplot as plt import numpy as np import csv # 注意路径要加引号!你原来的os.chdir(r/....)是语法错误 os.chdir(r'你的文件所在绝对路径') # 读取txt并指定float类型 M1 = pd.read_csv('M1 - 2020_16 jan maybe fbeta.txt', header=0, delimiter=' ', dtype=float) # 保存CSV时禁用索引,避免多余的非数值列 M1.to_csv('M1.csv', index=False) # 读取CSV时跳过表头行,只处理数值内容 with open("M1.csv") as f: M2 = csv.reader(f) next(M2) # 跳过第一行的表头 x = list(M2) M2 = np.array(x).astype("float") print(M2)
方案2:直接用Pandas处理(更简洁高效)
Pandas的数据框本身就是数值型的,直接转numpy数组或者直接绘图都很方便,完全不需要额外的csv读取步骤:
import pandas as pd import os from matplotlib import pyplot as plt os.chdir(r'你的文件所在绝对路径') # 读取txt后直接得到数值型数据框 M1 = pd.read_csv('M1 - 2020_16 jan maybe fbeta.txt', header=0, delimiter=' ', dtype=float) # 转numpy数组直接用to_numpy() M2 = M1.to_numpy() print(M2) # 直接绘图,比如取第一列做x轴,第二列做y轴 plt.plot(M1.iloc[:, 0], M1.iloc[:, 1]) plt.show()
方案3:批量处理多个TXT文件(满足你后续合并绘图的需求)
针对你计划合并多个TXT到同一Excel并对比绘图的需求,这里给你一套批量处理的代码:
import pandas as pd import os from matplotlib import pyplot as plt os.chdir(r'你的所有TXT文件所在目录') # 存储每个文件的数据,key是文件名,value是对应的数据框 all_datasets = {} # 遍历目录下所有txt文件 for file_name in os.listdir('.'): if file_name.endswith('.txt'): # 读取每个txt文件,确保是数值类型 df = pd.read_csv(file_name, header=0, delimiter=' ', dtype=float) # 添加一列标记数据来源,方便后续区分 df['source'] = file_name.replace('.txt', '') all_datasets[file_name] = df # 合并所有数据到一个数据框 combined_df = pd.concat(all_datasets.values(), ignore_index=True) # 保存到Excel:可以把所有数据放同一sheet,也可以每个文件单独一个sheet with pd.ExcelWriter('combined_data.xlsx') as writer: # 保存合并后的所有数据 combined_df.to_excel(writer, sheet_name='All_Merged', index=False) # 每个文件单独保存一个sheet(可选) for name, df in all_datasets.items(): # Excel表名不能太长,做个截断处理 sheet_name = name.replace('.txt', '')[:30] df.to_excel(writer, sheet_name=sheet_name, index=False) # 绘制对比图:每个文件的第二列随第一列变化 plt.figure(figsize=(10, 6)) for name, df in all_datasets.items(): plt.plot(df.iloc[:, 0], df.iloc[:, 1], label=name) plt.legend(title='数据源') plt.xlabel('X轴变量') plt.ylabel('Y轴变量') plt.title('多个数据集对比') plt.grid(True) plt.show()
另外提醒下:你原来代码里的os.chdir(r/....)是语法错误,路径字符串必须加引号,比如os.chdir(r'C:\Users\yourname\data')。
内容的提问来源于stack exchange,提问作者Mohammed Hussain




