将多个2D数据帧转换为一个3D数据帧

时间:2020-05-20 15:44:51

标签: python pandas dataframe

我正在尝试将2d数据帧列表转换为一个大数据帧。假设我有以下示例,在该示例中,我创建了一组数据框,每个数据框具有相同的列/索引:

import pandas as pd
import numpy as np

frames = []

names = []

frame_columns = ['DataPoint1', 'DataPoint2']

for i in range(5):
    names.append("DataSet{0}".format(i))

    frames.append(pd.DataFrame(np.random.randn(3, 2), columns=frame_columns))

我想将这组数据帧转换为一个数据帧df,我可以使用df['DataSet0']['DataPoint1']访问它。

此数据集将必须具有由['DataPoint1', 'DataPoint2']与各个数据帧的索引的乘积组成的多索引(当然,对于所有各个帧都是相同的)。

相反,列将作为['Dataset0', ...]['DataPoint1', 'DataPoint2']的乘积给出。

无论哪种情况,我都可以创建一个对应的MultiIndex并基于此派生一个(空)数据框:

mux = pd.MultiIndex.from_product([names, frames[0].columns])
frame = pd.DataFrame(index=mux).T

但是,我想显示数据框的内容,而不必添加它们。

请注意,this也曾问过类似的问题。但是,答案似乎与Panel类有关,到目前为止,该类已被弃用。 同样,{{3}}线程建议加入,这并不是我真正需要的。

1 个答案:

答案 0 :(得分:3)

IIUC,您可以将concatkeys一起使用:

total_frame = pd.concat(frames, keys=names)

输出:

            DataPoint1  DataPoint2
DataSet0 0   -0.656758    1.776027
         1   -0.940759    1.355495
         2    0.173670    0.274525
DataSet1 0   -0.744456   -1.057482
         1    0.186901    0.806281
         2    0.148567   -1.065477
DataSet2 0   -0.980312   -0.487479
         1    2.117227   -0.511628
         2    0.093718   -0.514379
DataSet3 0    0.046963   -0.563041
         1   -0.663800   -1.130751
         2   -1.446891    0.879479
DataSet4 0    1.586213    1.552048
         1    0.196841    1.933362
         2   -0.545256    0.387289

然后您可以通过以下方式提取Dataset0

total_frame.loc['DataSet0']

如果您确实想使用MultiIndex列,则可以将axis=1添加到concat:

total_frame = pd.concat(frames, axis=1, keys=names)