同一索引的多个列

时间:2018-02-01 10:45:27

标签: python python-2.7 pandas

对于我的每个不同样本,我都有不同运行中生成的统计数据列表:

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并且正确的索引和列足以让构造函数弄清楚如何填充数据框?那我该怎么办呢?

1 个答案:

答案 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