【问题标题】:Concatenate MultiIndex DataFrames with column headers将 MultiIndex 数据帧与列标题连接起来
【发布时间】: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    

【问题讨论】:

    标签: python pandas concat multi-index


    【解决方案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')
    

    【讨论】:

    • 非常感谢您的帮助!第一个建议解决了我的问题。只是一个简单的括号在错误的地方:-)
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2013-10-09
    • 2016-08-18
    • 2014-08-09
    • 2019-09-15
    • 2019-06-29
    相关资源
    最近更新 更多