从Universe Sandbox 2导出的CSV中提取浮点值并存入NumPy数组
解决方案
问题根源
你的CSV文件开头包含4行带双引号包裹的注释行,直接用常规方式读取会将注释内容混入数据列,导致整个列的类型为object,无法直接转换为浮点型。
步骤1:正确读取CSV文件
通过跳过注释行并处理引号格式,让Pandas正确解析数值数据:
方法一:直接跳过前4行注释
import pandas as pd import csv # 替换成你的CSV文件路径(Colab中可先上传文件或使用对应路径) df = pd.read_csv( 'your_file.csv', skiprows=4, # 跳过前4行注释内容 header=0, # 第5行作为表头 quotechar='"' # 处理每行的双引号包裹格式 )
方法二:动态过滤注释行(适用于注释行数不固定的情况)
如果注释行数可能变化,先读取所有行并过滤掉以"#开头的行:
with open('your_file.csv', 'r') as f: # 去掉每行首尾的双引号,同时过滤掉注释行 filtered_lines = [line.strip().strip('"') for line in f if not line.strip().startswith('"#')] # 从过滤后的行构建DataFrame header = filtered_lines[0].split(',') data_rows = [row.split(',') for row in filtered_lines[1:]] df = pd.DataFrame(data_rows, columns=header)
步骤2:验证并转换数据类型
读取完成后,检查数据类型:
print(df.dtypes)
正常情况下,两列都应显示为float64。如果仍有异常,强制转换为数值型(自动忽略无法转换的无效内容):
df['TimePassed (year)'] = pd.to_numeric(df['TimePassed (year)'], errors='coerce') df['Body.RelativeSpeed (km/s)'] = pd.to_numeric(df['Body.RelativeSpeed (km/s)'], errors='coerce')
步骤3:转换为NumPy数组
将处理好的DataFrame转换为NumPy数组,方便后续分析:
import numpy as np # 提取单独的一维数组 time_array = df['TimePassed (year)'].to_numpy() speed_array = df['Body.RelativeSpeed (km/s)'].to_numpy() # 或转换为二维数组(包含两列数据) full_data_array = df.to_numpy()
步骤4:图形分析示例
用Matplotlib绘制时间与相对速度的关系图:
import matplotlib.pyplot as plt plt.plot(time_array, speed_array, linewidth=1.5) plt.xlabel('Time Passed (year)') plt.ylabel('Relative Speed (km/s)') plt.title('Earth Relative Speed vs. Time') plt.grid(alpha=0.3) plt.show()
内容的提问来源于stack exchange,提问作者RadAstronomer
相关产品推荐
相关产品推荐

