Python Pandas文件解析:" "分隔仿真结果的多维度处理与拆分
拆分仿真结果的两种解决方案
嘿,针对你拆分仿真结果的需求,我给你准备了两种靠谱的方案,分别对应Pandas添加维度和按固定行数拆分numpy数组的需求,一起来看看~
方法一:给Pandas DataFrame添加维度(用块标记实现)
因为你的数据是用空行分隔不同仿真结果,首先得先识别每个仿真块,然后给数据加上仿真ID作为新维度,这样就能轻松区分不同的仿真结果了:
- 读取并预处理数据,标记每个仿真块的ID
import pandas as pd # 读取原始文本文件 with open('your_simulation_data.txt', 'r') as f: lines = f.readlines() # 遍历每行,给每个仿真块分配唯一ID(空行触发新块) block_id = 0 block_ids = [] for line in lines: if line.strip() == '': # 空行表示新的仿真结果开始 block_id += 1 block_ids.append(block_id) # 过滤掉空行,把有效数据转成DataFrame filtered_lines = [line for line in lines if line.strip() != ''] df = pd.read_csv(pd.io.common.StringIO(''.join(filtered_lines)), sep='\s+') # 给DataFrame添加仿真ID列,作为新维度 df['simulation_id'] = block_ids[:len(df)]
- 可选:转成多层索引结构
如果想让维度更清晰,可以把simulation_id设为第一层索引,这样每个仿真结果就是一个子DataFrame:
# 设置多层索引,方便按仿真块提取数据 df_multi_index = df.set_index(['simulation_id', df.index]) # 提取第一个仿真块的数据示例 first_simulation_data = df_multi_index.loc[0]
这种方法的好处是,就算某个仿真块的行数不是固定8行,也能准确拆分,容错性更高。
方法二:按每8行拆分成numpy数组
如果每个仿真结果正好固定是8行,那直接转成numpy数组后reshape就非常高效:
- 读取数据并转成numpy数组
import pandas as pd import numpy as np # 读取数据时跳过空行 df = pd.read_csv('your_simulation_data.txt', sep='\s+', skip_blank_lines=True) # 把DataFrame转成numpy数组 data_array = df.to_numpy()
- 按每8行拆分三维数组
# 计算总共有多少个完整的仿真块 total_blocks = len(data_array) // 8 # 把数组reshape成三维结构:(仿真块数量, 每块行数, 列数) split_simulations = data_array[:total_blocks*8].reshape(total_blocks, 8, -1) # 提取第一个仿真块的数组示例 first_sim_block = split_simulations[0]
注意:如果你的数据里存在不完整的仿真块(最后一块不足8行),上面的代码会自动忽略这部分,你可以根据需求调整是否保留。
内容的提问来源于stack exchange,提问作者John Shearer
相关产品推荐
相关产品推荐

