如何将两个(或更多)数据帧连接到一个面板

时间:2016-08-03 15:56:37

标签: python pandas

我最近尝试将两个数据框连接到一个面板中,我尝试将pd.concat用于axis=2

考虑数据框df1df2

df1 = pd.DataFrame(np.random.rand(3, 3), list('abc'), list('def'))
df2 = pd.DataFrame(np.random.rand(3, 3), list('abc'), list('def'))

然后我试了

pd.concat([df1, df2], axis=2)

enter image description here

这与我使用axis=1的情况相同。也许pandas只是检查axis是否评估为True。我们试试

pd.concat([df1, df2], axis='This Has To Break...Right?')

enter image description here

都能跟得上!没有休息。好的,那么如何在axis=2

中连接两个数据帧

我可以

pd.Panel(np.stack([df1, df2])).to_frame()

enter image description here

但这会忽略指数,如果它们不同则不会对齐它们。

我想要一些看起来像

的东西
panel

<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 3 (major_axis) x 3 (minor_axis)
Items axis: 0 to 1
Major_axis axis: a to c
Minor_axis axis: d to f

panel.to_frame()

enter image description here

2 个答案:

答案 0 :(得分:1)

不确定您在寻找什么,但是:

pd.Panel(np.stack([df1, df2]), major_axis=df1.index, minor_axis=df2.columns ).to_frame()

                    0         1
major minor                    
a     d      0.630339  0.020119
      e      0.736730  0.874750
      f      0.530833  0.637081
b     d      0.759991  0.499921
      e      0.651995  0.310123
      f      0.005724  0.759712
c     d      0.510702  0.067634
      e      0.367993  0.893205
      f      0.030383  0.591366


data = {0 : df1,   1 : df2}
pd.Panel(data)

<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 3 (major_axis) x 3 (minor_axis)
Items axis: 0 to 1
Major_axis axis: a to c
Minor_axis axis: d to f


data = {0 : df1,   1 : df2}
pd.Panel(data).to_frame()

                    0         1
major minor                    
a     d      0.630339  0.020119
      e      0.736730  0.874750
      f      0.530833  0.637081
b     d      0.759991  0.499921
      e      0.651995  0.310123
      f      0.005724  0.759712
c     d      0.510702  0.067634
      e      0.367993  0.893205
      f      0.030383  0.591366

答案 1 :(得分:0)

您可以使用pd.Panel构造函数并传递数据框字典。

def concat2(dfs, keys=None):
    if keys is None:
        keys = range(len(dfs))
    return pd.Panel({k:v for k, v in zip(keys, dfs)})

这感觉就像pd.concat(dfs, axis=1, keys=keys)应该做的那样。

示范

concat2([df1, df2]).to_frame()

enter image description here

concat2([df1, df2], ['df1', 'df2']).to_frame()

enter image description here