如何用Pandas和Numpy读取CSV并提取非对角线值转为一维列?
解决方案
问题根源
- 读取CSV时的分隔符错误:你的CSV用
|作为分隔符且带空格,但原代码未指定分隔规则,pandas默认用逗号分割,导致第一行被识别成表头,后续数据读取混乱,首行数据丢失。 - 未过滤对角线元素:直接
ravel会保留所有元素,包括对角线的0值。
修正后的代码
import numpy as np import pandas as pd # 正确读取CSV:指定分隔符为带空格的|,且无表头 data = pd.read_csv( r"C:\Users\soso-\Desktop\SVM\DataSet\chem_Jacarrd_sim.csv", sep=r'\s*\|\s*', # 匹配带任意空格的|分隔符 header=None, # 第一行是数据,不是表头 engine='python' # python引擎支持正则分隔符,避免警告 ) # 转换为numpy数组 row_vector = np.array(data) # 生成掩码:排除对角线元素(仅保留i != j的位置) mask = np.eye(row_vector.shape[0], dtype=bool) filtered_data = row_vector[~mask] # 转换为单列DataFrame并保存 df = pd.DataFrame({'chem': filtered_data}) df.to_csv("my2.csv", index=False) # index=False避免保存额外的索引列
代码说明
sep=r'\s*\|\s*':用正则匹配分隔符,不管|前后有多少空格,都能正确分割数据。header=None:告诉pandas第一行是数据而非表头,避免首行丢失。np.eye生成和数组同大小的单位矩阵(对角线为True),取反~mask后,对角线位置会被过滤,只保留非对角线元素。index=False:保存CSV时不会自动添加索引列,输出格式更符合需求。
内容的提问来源于stack exchange,提问作者Sara Almashharawi
相关产品推荐
相关产品推荐

