将 MultiIndex DataFrames 与列 headers 连接起来

Concatenate MultiIndex DataFrames with column headers

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

我通过 multi-period 计算 horizon 报告了几个细分市场(例如 0 到 3)。每个段都有几个与之关联的数据帧(例如 df1 和 df2)。 为了简单起见,这里只假设一个段(每个不同的段都有一个特定的键或场景键)。

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

具体来说,我想将 "Full Key"、"Scenario" 和 "Metric" 打印到 CSV 的 headers 列(在第 0、1 和 2 列中)并继续打印句点(在第 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    

您可以在 concat, not in MultiIndex.from_product:

中使用参数 names
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')