如何从 pandas 数据帧列表中提取 4 维数据?

How to extract 4dimensional data from a list of pandas dataframes?

我有一个 500 dataframes 的列表(以 .csv 文件的形式); 500 = 20(时间)x 25(能量)箱。换句话说,每个数据帧都是 flux 在单个时间和能量的测量,表示为 150x150 网格对应于 xy 空间坐标。但是,我想将这些数据转换为 Flux(x, y, t, E) 这样我就有了一组包含列 E 和行的新数据框t 对于任何给定的 (x,y) 位置。 我不确定如何解决这个问题。如果你能给我一些执行此过程的路线图,我将不胜感激。

注意: 每个数据帧的时间和能量在相应的.csv文件的名称中,格式为time-5e+35-energy0.00023-position.csv 其中 t=-5 10^35 和 E=0.00023.

我所知道的: 20tx25E 的 500 个数据帧必须转换为 150x150 坐标的 22,500 个数据帧。但是,这非常耗时,我不确定 python3 中是否有任何其他软件包可以更轻松地完成这项工作。

将您的文件组合成一个大 Pandas 数据帧的代码,大小为 11,250,00025 × 20 × 150 × 150:

import pandas as pd
from glob import glob
import re
from datetime import datetime

pattern_file_name = re.compile(r'time-(.*)-energy(.*)-position.csv')

start_time = datetime.now()

result_df = None
for file_name in glob('time-*.csv'):

  # extract time and energy values from file name
  if not pattern_file_name.match(file_name):
    raise ValueError(f'file name {file_name} failed pattern match.')
  time_s, energy_s = pattern_file_name.findall(file_name)[0]
  time, energy = float(time_s), float(energy_s)
  
  print(f'Processing | {time_s} | {energy_s} |...')
  df = pd.read_csv(file_name, header=None)
  
  # assuming the CSV (i) has no headers (ii) is an array of 150x150...
  # ...floats with no missing or problematic values (iii) each row...
  # ...represents a fixed y-coordinate; adjust to your needs
  df.index.name = 'y'
  df = df.stack()
  df.index.rename('x', level=-1, inplace=True)
  df = df.swaplevel().sort_index().reset_index().rename(columns={0: 'flux'})
  # df is now (x, y, f)
  # x and y will each vary from 0 to 149
  
  df.insert(0, 't', time)
  df.insert(0, 'E', energy)
  
  result_df = df if result_df is None else pd.concat([result_df, df])
  
result_df = result_df.set_index(['E', 't', 'x', 'y']).sort_index()
# result_df is now (E, t, x, y) -> flux
result_df.to_csv('output.csv', index=True)

final_time = datetime.now()
delta_time = final_time - start_time

print(f'Completed in {delta_time}')

主要步骤如下:

  • 遍历文件名
  • 从文件名中提取 tE
  • 从文件中读取通量值的方阵
  • 150 × 150 方阵转换为 Pandas 长度为 22,500
  • 的数据帧
  • 添加列以跟踪 Et
  • 将局部结果附加到全局的、不断增加的结果向量中
  • 最后,退出循环并将结果以 CSV 格式保存到磁盘

生成的 CSV 文件将包含 5 列。前四列表示 (E,t,x,y),最后一列是这些坐标处的通量场值。