对于我的每个不同示例,我都有在不同运行中生成的统计列表:

d = {
    "sample1": [
        {"stat1": 'a', "stat2": 98},  # stats for sample1, 1st run
        {"stat1": 'z', "stat2": 13},  # stats for sample1, 2nd run
    ],
    "sample2": [
        {"stat1": 'y', "stat2": 1089},  # stats for sample2, 1st run
        {"stat1": 'a', "stat2": 1015},  # stats for sample2, 2nd run
    ],
}

我试着用这个创建一个DataFrame,这样统计数据就可以很容易地管理了。例如,我想看看给定样本的stat2的平均值。或所有样本最常见的stat1值。
所以df.loc["sample2"]但是返回所有的“行”统计数据。df.loc[["sample1", 3]]将返回第4次运行。df["stat1"]当然会返回所有样本和运行的整个列,而df.loc["sample1"]["stat2"]返回sample1的stat2列。我希望我得到了正确的索引,我不太熟悉熊猫。
我做不到。我试过使用pd.MultiIndex,但没有真正起作用:
index = pd.MultiIndex.from_tuples(???, names=['sample', 'run'])
df = pd.DataFrame(d, columns=['stat1', 'stat2'], index=index)

我试过将每个样本与[("sample1", 0), ("sample1", 1), ("sample2", 0), ("sample2", 1)]这样的运行次数配对,但这并没有真正实现,因为每个样本的运行次数并不总是相同的。
而且,所有值都NaN,所以在传递数据时我一定做错了什么。传递d和适当的索引和列难道不足以让构造函数找出如何填充数据帧吗?那我还能怎么做呢?

最佳答案

我认为您需要concatdict comprehension,如果需要更改MultiIndex的列名,请添加rename_axis

df = pd.concat({k:pd.DataFrame(v) for k, v in d.items()}).rename_axis(('sample','run'))
print (df)
            stat1  stat2
sample  run
sample1 0       a     98
        1       z     13
sample2 0       y   1089
        1       a   1015

10-07 19:11