【问题标题】:Pandas MultiIndex DataFrame outer productPandas MultiIndex DataFrame 外积
【发布时间】:2019-05-20 06:29:42
【问题描述】:

我有两个 MultiIndex 数据帧

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

一般我该怎么做?请注意,可能有任意数量的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)

【问题讨论】:

  • 首先,请以我不必手动输入的形式提供数据框。
  • 添加代码以在编辑中重现

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


【解决方案1】:

我想出的一个不满意的方法涉及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 结构。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2016-11-06
    • 1970-01-01
    • 2017-03-28
    • 2021-05-18
    • 2023-03-25
    • 2019-02-08
    • 2023-04-08
    • 2016-04-01
    相关资源
    最近更新 更多