对于我的每个不同示例,我都有在不同运行中生成的统计列表:
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
和适当的索引和列难道不足以让构造函数找出如何填充数据帧吗?那我还能怎么做呢? 最佳答案
我认为您需要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