You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Pandas DataFrame转换为MxNxD多维列表(无显式循环实现)

高效实现按Case/Run分组的MxNxD多维列表转换

推荐方案:利用Pandas分组聚合(无显式循环,高效Pythonic)

如果你的数据集是Pandas DataFrame,这是最优解——借助Pandas底层优化的分组逻辑,完全避免手动嵌套循环,代码简洁且性能拉满。

步骤示例:

  1. 先准备样例数据(模拟你的数据集结构):
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]
})
  1. 核心转换代码:
# 自动识别目标列: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:35:33