You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Pandas将TXT转CSV后转NumPy数组绘图遇类型转换错误求助

解决字符串转float失败的问题,附多文件合并绘图方案

看起来你在处理文本转CSV/Excel并绘图时遇到了字符串转float的报错,我帮你分析下原因并给出几个实用解决方案:

错误原因分析

你遇到的ValueError: could not convert string to float: 主要来自两个细节问题:

  1. 你的M1.to_csv('M1.csv')默认会写入Pandas的索引列(就是CSV里第一列的0,1,2,...),同时CSV还包含表头行,用csv.reader读取时会把这些非数值内容读进来,转float自然失败。
  2. 其实你完全没必要绕弯用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

火山引擎 最新活动