我有两个要联接的表-主表具有索引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')
,但这由于多索引而失败。子表中的索引可以是单索引,只要我不丢失其他字段的多索引即可。
答案 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')])