将多个键上的 pandas 数据帧映射为列或 multiIndex

Posted

技术标签:

【中文标题】将多个键上的 pandas 数据帧映射为列或 multiIndex【英文标题】:Map pandas dataframe on multiple keys as columns or multiIndex 【发布时间】:2017-01-03 14:18:28 【问题描述】:

设置:两个熊猫数据框;需要将来自 df2 的数据添加到 df1,如下所述:

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

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

得知在 pandas 中“未实现在 multiIndex 上合并多个级别的重叠”后,我建议映射值,但尚未找到映射(多个)索引级别或多个列的方法,如果将索引级别重置为列:

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)

【问题讨论】:

也许你可以发布一个例子?有时,只是 df1.head(20) 或类似的输出。 【参考方案1】:

您可以临时更改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 中的索引转换为列,以便您可以进行正常连接。完成后将列重新转换为索引。

【讨论】:

以上是关于将多个键上的 pandas 数据帧映射为列或 multiIndex的主要内容,如果未能解决你的问题,请参考以下文章

根据 pandas df 中的多个条件映射不同的数据帧

pandas 获得两列或多列的逐行最小值

如何在 pandas 中使用 apply 函数,同时将索引映射到两个不同的数据帧?

Pandas:确定从唯一行到原始数据帧的映射

Pandas:将 Lambda 应用于多个数据帧

Pandas DataFrame 函数应用和映射