首页 > 解决方案 > 加入带有多索引的熊猫表

问题描述

我有两个要加入的表 - 主表有 index SourceID,子表是多索引的,因为它来自数据透视表 - 索引是(SourceID, sourceid)

如何将具有单个索引的表连接到具有多索引的表(或将多索引表更改为单数)?

子表创建如下:

d = {'SourceID': [1, 1, 2, 2, 3, 3, 3], 'Year': [0, 1, 0, 1, 1, 2, 3], 'Sales': [100, 200, 300, 400 , 500, 600, 700], 'Profit': [10, 20, 30, 40, 50, 60, 70]}
df = pd.DataFrame(data=d)
df_sub = (
  df
  .pivot_table(
    index=['SourceID'],
    columns=['Year'],
    values=['Sales', 'Profit'],
    fill_value=0,
    aggfunc='mean'
  )
  # .add_prefix('sales_')
  .reset_index()
)

L = [(a, f'{a.lower()}{b}') for a, b in df_sub.columns]
df_sub.columns = pd.MultiIndex.from_tuples(L)
df_sub = df_sub.reset_index()

然后我试图将它与主表连接起来df_main

df_all = df_sub.join(df_main.set_index('SourceID'), on='SourceID.sourceid')

但这由于多索引而失败。只要我不丢失其他字段上的多索引,子表中的索引可以是单一的。

标签: pythonpandas

解决方案


这是可能的,但是 MultiIndex 值被转换为元组:

df_all = df_sub.join(df.set_index('SourceID'), on=[('SourceID','sourceid')])
print (df_all)

如果需要MultiIndex输出也需要将df列转换为MultiIndex,例如MultiIndex.from_product

df1 = df.copy()
df1.columns = pd.MultiIndex.from_product([['orig'], df1.columns])

df_all = df_sub.join(df1.set_index([('orig','SourceID')]), on=[('SourceID','sourceid')])

推荐阅读