在一个MultiIndex列数据框中压缩多个数据框

时间:2019-11-28 18:18:20

标签: python pandas

我有几个带有列(字母)的数据框,它们是我在不同时期的所有字母和时间索引的子集。对于每个时期,我都有几个带有不同字母信息(数字)的数据框。

import pandas as pd

df_1a = pd.DataFrame([[1, 2], [3, 4]], index=['2019-01-01', '2019-01-02'], columns=['A', 'C'])
df_1b = pd.DataFrame([[1, 2], [3, 4]], index=['2019-01-03', '2019-01-04'], columns=['A', 'B'])
df_2a = pd.DataFrame([[5, 0, 6], [7, 8, 8]], index=['2019-01-01', '2019-01-02'], columns=['A', 'B', 'C'])
df_2b = pd.DataFrame([[5, 6], [8, 8]], index=['2019-01-03', '2019-01-04'], columns=['B', 'C'])

我想在一个主数据帧df_master中获得所有信息,该数据帧应具有以下结构:

columns = pd.MultiIndex.from_product([['A', 'B', 'C'],[1, 2]], names=['Letters', 'Numbers'])

df_master = pd.DataFrame(index=['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04'],  columns=columns)

从以前的数据帧中获取最终数据帧的最佳方法是什么?


我已经成功地逐列进行了操作,但是我感觉必须有一种更有效的方法。

我对每个数据帧所做的操作(循环):

for letter in df_1a.columns.unique():
    df_master.loc[df_1a.index, pd.IndexSlice[letter, 1]] = df_1a[letter]

1 个答案:

答案 0 :(得分:1)

您的命名方案有些困难。但这是一个解决方案:

(pd.DataFrame({k:pd.concat(ds, sort=True).stack() 
                  for k,ds in enumerate([(df_1a, df_1b), (df_2a, df_2b)],
                                        start=1)})
   .unstack()
   .swaplevel(0,1, axis=1)
   .sort_index(axis=1)
)

输出:

              A         B         C     
              1    2    1    2    1    2
2019-01-01  1.0  5.0  NaN  0.0  2.0  6.0
2019-01-02  3.0  7.0  NaN  8.0  4.0  8.0
2019-01-03  1.0  NaN  2.0  5.0  NaN  6.0
2019-01-04  3.0  NaN  4.0  8.0  NaN  8.0