使用列标题连接MultiIndex DataFrames

时间:2017-01-02 19:21:18

标签: python pandas concat multi-index

我将几个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 个答案:

答案 0 :(得分:3)

您可以在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')