熊猫MultiIndex DataFrame外部产品

时间:2018-12-19 17:53:10

标签: python python-3.x pandas dataframe multi-index

我有两个MultiIndex DataFrames

df1

df2

,并希望以我产生的方式将两者相乘:

enter image description here

通常我该怎么做?请注意,可能有任意数量的foo变量,每个变量都可以包含任意数量的bar变量。

以下是用于重现两个原始数据帧df_1df_2的代码:

vals_1 =  pd.np.random.rand(2, 4) * 100
tuples_1 = [('A', 'P'), ('A', 'Q'), ('B', 'R'), ('B', 'S')]
idx_1 = pd.MultiIndex.from_tuples(tuples_1, names=['foo', 'bar'])
df_1 = pd.DataFrame(vals_1, columns=idx_1)

rs = pd.np.random.rand(2, 1)
rs2 = pd.np.random.rand(2, 1)
vals_2 = pd.np.concatenate([rs, 1 - rs, rs2, 1 - rs2], axis=1)
tuples_2 = [('A', 'spam'), ('A', 'eggs'), ('B', 'spam'), ('B', 'eggs')]
idx_2 = pd.MultiIndex.from_tuples(tuples_2, names=['foo', 'qux'])
df_2 = pd.DataFrame(vals_2, columns=idx_2)

1 个答案:

答案 0 :(得分:0)

我想出的一种不令人满意的方法涉及pd.meltpd.pivot_table

melted_1 = pd.melt(df_1.reset_index(), id_vars=['index'], value_name='val')
melted_2 = pd.melt(df_2.reset_index(), id_vars=['index'], value_name='val')
merged = pd.merge(melted_1, melted_2, on=['index', 'foo'], how='left')
merged['val'] = merged['val_x'] * merged['val_y']
merged = merged.drop(['val_x', 'val_y'], axis=1)
df_3 = pd.pivot_table(merged, values='val', index='index', columns=['foo', 'bar', 'qux'])

理想情况下,回旋解决方案较少,可以始终保留MultiIndex结构。