将 MultiIndex 数据帧与列标题连接起来

Posted

技术标签:

【中文标题】将 MultiIndex 数据帧与列标题连接起来【英文标题】:Concatenate MultiIndex DataFrames with column headers 【发布时间】:2017-05-16 21:07:53 【问题描述】:

我将几个 Pandas DataFrame 连接到一个大 DataFrame 中,以将结果打印到 CSV 文件中。

我报告了多周期计算范围内的多个细分(例如 0 到 3)。每个段都有几个与之关联的 DataFrame(例如 df1 和 df2)。 为简化起见,这里只假设一个段(每个不同的段都有一个特定的键或场景键)。

一切正常,除了将列名打印到 CSV。 我试过pd.concat(..., names = " ... ") - 但这不起作用。唯一打印到标题的是不同的日期。

具体来说,我想将“Full Key”、“Scenario”和“Metric”打印到 CSV 的列标题(在第 0、1 和 2 列中)并继续打印句点(在第 3 列到第 3 列中) 6).

在 Pandas 中是否有一种简单的方法可以做到这一点?

例子

import pandas as pd
import numpy as np

dates = [0, 1, 3, 3]
labels1 = ["A", "B", "C"]
labels2 = ["X", "Y", "Z"]
rand1 = np.random.rand(3,4)
rand2 = np.random.rand(3,4)

df1 = pd.DataFrame(rand1, columns=dates, index=labels1)
df2 = pd.DataFrame(rand2, columns=dates, index=labels2)

# Differs for each segment (note: just one segment assumed here for simplification)
key = "rand_key"
scenario = "scenario"

df_con = pd.concat([df1, df2], keys=pd.MultiIndex.from_product(
    [[key], [scenario], ["Data Frame 1", "Data Frame 2"]],
    names=['Full Key', 'Scenario', 'Metric']))

print(df_con)

输出

                                         0         1         3         3
rand_key scenario Data Frame 1 A  0.381607  0.251023  0.225814  0.221244   
                               B  0.829346  0.148782  0.601416  0.410067   
                               C  0.785393  0.792234  0.012604  0.476273   
                  Data Frame 2 X  0.960281  0.563819  0.286736  0.530170   
                               Y  0.829257  0.986729  0.790758  0.013667   
                               Z  0.287239  0.796072  0.576769  0.694845    

【问题讨论】:

【参考方案1】:

您可以在concat 中使用参数names,而不是在MultiIndex.from_product

df_con = pd.concat([df1, df2], 
                   keys=pd.MultiIndex.from_product(
                        [[key], [scenario], ["Data Frame 1", "Data Frame 2"]]), 
                   names=["Full Key", "Scenario","Metric", 'val'])

print(df_con)
                                           0         1         3         3
Full Key Scenario Metric       val                                        
rand_key scenario Data Frame 1 A    0.824102  0.525212  0.386341  0.590881
                               B    0.137524  0.808270  0.965826  0.779796
                               C    0.239335  0.867260  0.808115  0.063681
                  Data Frame 2 X    0.231228  0.589685  0.137487  0.678441
                               Y    0.992191  0.285752  0.760913  0.046527
                               Z    0.332536  0.944553  0.636517  0.601849

如果需要删除级别val

df_con = df_con.reset_index(level='val', drop=True)
print (df_con)
                                       0         1         3         3
Full Key Scenario Metric                                              
rand_key scenario Data Frame 1  0.686811  0.726811  0.479694  0.367657
                  Data Frame 1  0.839970  0.454164  0.321366  0.092720
                  Data Frame 1  0.060438  0.090951  0.682706  0.680736
                  Data Frame 2  0.243174  0.640461  0.069139  0.872920
                  Data Frame 2  0.109607  0.169056  0.467378  0.775949
                  Data Frame 2  0.854445  0.210386  0.076642  0.788915

上次写信给csv

df_con.to_csv('file.csv')

另一种解决方案是设置索引名称:

df_con.index.names = ["Full Key", "Scenario","Metric", 'val']
df_con.to_csv('file.csv')

最后的解决方案是rename_axis:

df_con.rename_axis(["Full Key", "Scenario","Metric", 'val']).to_csv('file.csv')

【讨论】:

非常感谢您的帮助!第一个建议解决了我的问题。只是一个简单的括号在错误的地方:-)

以上是关于将 MultiIndex 数据帧与列标题连接起来的主要内容,如果未能解决你的问题,请参考以下文章

pandas:将两个 DataFrame 与已排序的 MultiIndex 连接起来,使得结果具有已排序的 MultiIndex

pandas 有效地将 DataFrames 与不匹配的分类列和 MultiIndex 级别连接起来

连接 3 级 MultiIndex [重复]

如何使用 MultiIndex 合并两个数据框?

Boost.MultiIndex:有没有办法在两个进程之间共享对象?

Pandas:如何将 MultiIndex DataFrame 与单个索引 DataFrame 连接,以及自定义排序