连接具有多索引的熊猫表

时间:2020-04-08 07:38:47

标签: python pandas

我有两个要联接的表-主表具有索引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')

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

1 个答案:

答案 0 :(得分:0)

有可能,但随后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')])