使用多索引迭代地连接 pandas 数据帧

Posted

技术标签:

【中文标题】使用多索引迭代地连接 pandas 数据帧【英文标题】:Iteratively concatenate pandas dataframe with multiindex 【发布时间】:2013-12-05 06:23:37 【问题描述】:

我正在迭代处理几个“组”,我想将它们一起添加到数据框中,每个组都由二级索引标识。

这个:

print pd.concat([df1, df2, df3], keys=["A", "B", "C"])

是向我建议的 - 但它不能很好地适应迭代。

我正在做

data_all = pd.DataFrame([])
    for a in a_list:
        group = some.function(a, etc)
        group = group.set_index(['CoI'], append=True, drop=True)
        group = group.reorder_levels(['CoI','oldindex'])
        data_all = pd.concat([data_all, group], ignore_index=False)

但最后一行完全破坏了我的多索引,我无法重建它。

你能帮帮我吗?

【问题讨论】:

我可能误读了代码,但为什么每次循环迭代都需要concatdata_all 可以只是一个列表,而你 concat 在 for 循环的末尾吗? 解决了!继续写一个答案,我会接受的。 【参考方案1】:

应该能够将data_all 设为一个列表并在最后连接一次:

data_all = []
for a in a_list:
    group = some.function(a, etc)
    group = group.set_index(['CoI'], append=True, drop=True)
    group = group.reorder_levels(['CoI','oldindex'])
    data_all.append(group)

data_all = pd.concat(data_all, ignore_index=False)

还请记住,pandas 的 concat 可与迭代器一起使用。像yield group 这样的东西可能比每次都附加到列表更有效。不过我还没有分析它!

【讨论】:

为什么 data_all 在循环的最后一行用括号括起来?由于 data_all 已经是一个列表,这似乎不必要地创建了一个列表列表。尝试对此进行测试时,我发现将数据帧列表传递给 concat 会引发“TypeError:无法连接非 NDFrame 对象”。此外,for 循环也不必要地缩进(如 OP 的帖子中所示)。

以上是关于使用多索引迭代地连接 pandas 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

将 Pandas 数据帧与多索引列和不规则时间戳连接起来

使用多索引列连接两个 pandas 数据框

为啥 pandas 多索引数据帧切片看起来不一致?

Pandas:组合多索引数据帧的标题行

pandas.concat:无法处理非唯一的多索引!熊猫蟒

Pandas:在多索引数据帧中重新索引和插值