将Pandas DataFrame转换为MxNxD多维列表(无显式循环实现)
高效实现按Case/Run分组的MxNxD多维列表转换
推荐方案:利用Pandas分组聚合(无显式循环,高效Pythonic)
如果你的数据集是Pandas DataFrame,这是最优解——借助Pandas底层优化的分组逻辑,完全避免手动嵌套循环,代码简洁且性能拉满。
步骤示例:
- 先准备样例数据(模拟你的数据集结构):
import pandas as pd # 模拟输入数据集 df = pd.DataFrame({ 'Case': ['A', 'A', 'A', 'B', 'B', 'B'], 'Run': [1, 1, 2, 3, 3, 4], 'Timestep': [0, 1, 0, 0, 1, 0], 'Value0': [10, 20, 15, 30, 40, 25], 'Value1': [100, 200, 150, 300, 400, 250] })
- 核心转换代码:
# 自动识别目标列:Timestep + 所有以Value开头的列 value_cols = [col for col in df.columns if col.startswith('Value')] target_cols = ['Timestep'] + value_cols # 第一步:按(Case, Run)分组,将每组的目标列转成D维度的列表(每个元素是[Timestep, Value0, ...]) run_level = df.groupby(['Case', 'Run'])[target_cols].apply(lambda x: x.values.tolist()).reset_index() # 第二步:按Case分组,将每个Case下的所有Run结果收集为N维度列表,最终得到MxNxD结构 final_result = run_level.groupby('Case')[0].apply(list).tolist()
结果说明:
final_result就是你要的嵌套列表:
- M:Case的数量(这里是2,对应Case A和B)
- N:每个Case下的Run数量(A有2个Run,B有2个Run)
- D:每个时间步的特征维度(这里是3:Timestep+Value0+Value1)
输出示例:
[ # Case A的两个Run数据 [ [[0, 10, 100], [1, 20, 200]], # Run 1的时间步数据 [[0, 15, 150]] # Run 2的时间步数据 ], # Case B的两个Run数据 [ [[0, 30, 300], [1, 40, 400]], # Run 3的时间步数据 [[0, 25, 250]] # Run 4的时间步数据 ] ]
标准库方案:用itertools.groupby(无第三方依赖)
如果不能用Pandas,用Python标准库的itertools.groupby也能实现,但需要先对数据排序(groupby要求分组键连续有序),代码略多但仍比手动嵌套循环简洁:
from itertools import groupby from operator import itemgetter # 模拟列表格式的输入数据 data_list = [ {'Case': 'A', 'Run': 1, 'Timestep': 0, 'Value0': 10, 'Value1': 100}, {'Case': 'A', 'Run': 1, 'Timestep': 1, 'Value0': 20, 'Value1': 200}, {'Case': 'A', 'Run': 2, 'Timestep': 0, 'Value0': 15, 'Value1': 150}, {'Case': 'B', 'Run': 3, 'Timestep': 0, 'Value0': 30, 'Value1': 300}, {'Case': 'B', 'Run': 3, 'Timestep': 1, 'Value0': 40, 'Value1': 400}, {'Case': 'B', 'Run': 4, 'Timestep': 0, 'Value0': 25, 'Value1': 250}, ] # 先按Case、Run排序,确保groupby能正确分组 sorted_data = sorted(data_list, key=itemgetter('Case', 'Run')) # 生成MxNxD结构 final_result = [] for _, case_group in groupby(sorted_data, key=itemgetter('Case')): run_data_list = [] for _, run_group in groupby(case_group, key=itemgetter('Run')): # 提取每个时间步的D维度数据 step_data = [[item['Timestep'], item['Value0'], item['Value1']] for item in run_group] run_data_list.append(step_data) final_result.append(run_data_list)
为什么这两种方案更优?
- 避免了手动嵌套循环的冗余代码,逻辑更清晰;
- Pandas方案利用了底层C实现的分组逻辑,大数据集下性能远高于纯Python循环;
- 代码扩展性强:新增Value列时,Pandas方案会自动识别,无需修改核心逻辑。
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

