将pandas数据帧映射到多个键作为列或multiIndex

时间:2016-08-26 20:32:11

标签: python pandas

设置:两个pandas数据帧;需要将df2中的数据添加到df1,如下所述:

  • df1和df2是multiIndexed,具有相同的四个级别
  • df1包含的行数多于df2
  • df1在索引的四个级别中的三个级别中,每个唯一组合具有三个副本(按行);也就是说,每一行仅相对于第4级
  • df2仅与其他3个级别的df1部分对齐(df2包含无关的行)
  • df2只包含一列

我想将df2的一列中的值添加到df1中行的所有三个副本,其中三个相应的级别匹配。

在pandas中了解到“在多指标上合并多个级别重叠并没有实现”,我建议映射这些值,但是没有找到一种方法来映射(多个)索引级别或多个列,如果将索引级别重置为列:

df1 = pd.DataFrame(np.array([['Dec', 'NY', 'Ren', 'Q1', 10],
   ['Dec', 'NY', 'Ren', 'Q2', 12],
   ['Dec', 'NY', 'Ren', 'Q3', 14],
   ['Dec', 'FL', 'Mia', 'Q1', 6],
   ['Dec', 'FL', 'Mia', 'Q2', 8],
   ['Dec', 'FL', 'Mia', 'Q3', 17],
   ['Apr', 'CA', 'SC', 'Q1', 1],
   ['Apr', 'CA', 'SC', 'Q2', 2],
   ['Apr', 'CA', 'SC', 'Q3', 3]]), columns=['Date', 'State', 'County', 'Quarter', 'x'])

df1.set_index(['Date', 'State', 'County', 'Quarter'], inplace=True)

df2 = pd.DataFrame(np.array([['Dec', 'NY', 'Ren', 0.4],
   ['Dec', 'FL', 'Mia', 0.3]]), columns=['Date', 'State', 'County', 'y'])

df2.set_index(['Date', 'State', 'County', 'y'], inplace=True)

df_combined = df1['Date', 'State', 'County'].map(df2)

1 个答案:

答案 0 :(得分:2)

您可以暂时更改df1以更改索引以进行加入:

df_combined = df1.reset_index(3).join(df2,how='left')

>>> df_combined
           level_3   x    y
Apr CA SC       Q1   1  NaN
       SC       Q2   2  NaN
       SC       Q3   3  NaN
Dec FL Mia      Q1   6  0.3
       Mia      Q2   8  0.3
       Mia      Q3  17  0.3
    NY Ren      Q1  10  0.4
       Ren      Q2  12  0.4
       Ren      Q3  14  0.4

df_combined.set_index('level_3',append=True, inplace=True)
df_combined.index.rename(None,3,inplace=True)

>>> df_combined
                x    y
Apr CA SC  Q1   1  NaN
           Q2   2  NaN
           Q3   3  NaN
Dec FL Mia Q1   6  0.3
           Q2   8  0.3
           Q3  17  0.3
    NY Ren Q1  10  0.4
           Q2  12  0.4
           Q3  14  0.4

reset_index方法用于临时将不在df2中的索引转换为列,以便您可以进行正常连接。完成后,将列重新转换为索引。