Pandas MultiIndex DataFrame внешний продукт - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть два MultiIndex DataFrames

df1

и

df2

и хочу умножить их так, чтобы я произвел:

enter image description here

Как я могу сделать это вообще?Обратите внимание, что может быть произвольное количество foo переменных, каждая из которых может содержать произвольные числа bar переменных.

Ниже приведен код для воспроизведения двух исходных фреймов данных, df_1 и df_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 голосов
/ 20 декабря 2018

Один неудовлетворительный подход, который я придумал, включает pd.melt и pd.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.

...