多索引数据帧外部产品

2024-06-17 13:42:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个多索引数据帧

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)

Tags: fromdf数量foonpbarrandompd
1条回答
网友
1楼 · 发布于 2024-06-17 13:42:25

我提出的一个不令人满意的方法涉及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'])

理想情况下,会有一个不太迂回的解决方案,始终保留多索引结构。你知道吗

相关问题 更多 >