对于我的每个不同样本,我都有不同运行中生成的统计数据列表:
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
并且正确的索引和列足以让构造函数弄清楚如何填充数据框?那我该怎么办呢?
答案 0 :(得分:4)
我认为您需要concat
dict 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