【问题标题】:How to correctly match pandas multiindex dataframe multiplication for sparse data如何正确匹配稀疏数据的熊猫多索引数据帧乘法
【发布时间】:2021-05-18 19:09:27
【问题描述】:

我在发布此内容之前进行了搜索,我在其他人中找到了 this previous stack overflow post,但我认为它不能回答我的问题。

我想通过索引正确匹配的稀疏数据相乘,其中数据是多级索引。

我在不同日期观察到多个element_ids 的不同attributes,但数据很少:

这是我的第二个数组df_weight_at_date 每个element_id 的权重列表(python 在帖子底部创建)

对于每个日期,我想将值相乘,例如在我观察到的数据中,A/1/2021-01-15 (0.87) 应乘以日期 1/2021-01-15 (0.3) 的权重,得到 0.261

如果任一值为NaN,则结果为NaN,输出帧将与df_observations 数据帧具有相同的形状。

我尝试过使用.multiply,但得到错误没有ValueError: cannot join with no overlapping index names

df_observations.multiply(df_weight_at_date.unstack())

此数据的预期输出

有点新手 - 不胜感激任何指针,谢谢

创建数据框的代码


df_observations=pd.DataFrame({'observed_date':['2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16'],
               'element_id':[1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,2,3,4,5,6,7,3,2,3,4,5,6,7],
                'factor_id':['A','A','A','A','A','A','A','B','B','B','B','B','B','B','C','C','C','A','A','A','A','A','A','F','F','B','B','B','B','B'],
               'observation':[0.87,0.84,0.15,0.6,0.17,0.76,0.03,0.91,0.05,0.38,0.06,0.27,0.92,0.27,0.16,0.71,0.32,0.92,0.88,0.53,0.79,0.15,0.3,0.16,0.36,0.05,0.22,0.73,0.7,0.9]}).pivot(index=['observed_date','element_id'], columns='factor_id', values='observation')


df_weight_at_date=pd.DataFrame({'observed_date':['2021-01-15','2021-01-15','2021-01-15',
                                 '2021-01-16','2021-01-17','2021-01-18',
                                 '2021-01-19','2021-01-20','2021-01-18'
                                ],
               'element_id':[1,3,5,1,3,5,1,3,9],
               'weight':[0.3,0.35,0.35,1,1,0.4,1,1,0.6]}).pivot(index=['element_id'], columns='observed_date', values='weight')

【问题讨论】:

  • 如果您发布预期的输出会很有帮助
  • 是的,当然 - 现在已经做到了,感谢您的推动
  • 我认为您的解决方案需要将轴更改为 0;你可以试试:df_observations.swaplevel() .rename_axis(index={"observed_date": "observation_date"}) .mul(df_weight_at_date.stack(), axis=0).sort_index(level="observation_date")你可能会有一些空行要摆脱
  • 谢谢 - 在 fcat 中我搞砸了,你的评论帮助我意识到:两个框架都应该有 observed_date 以便它们可以加入 - 第二个错误地有 observation_date - 我现在已经更正了那在帖子里

标签: python pandas sparse-matrix multiplication multi-index


【解决方案1】:

在更正输入帧以使索引名称匹配 (observation_date -> observed_date) 之后,现在可以正常工作并且我认为足够简洁

df_observations.multiply(df_weight_at_date.unstack(), axis=0)

结果

【讨论】:

    【解决方案2】:

    你可以尝试unstack df_weight_at_date:

    df_observations.mul(df_weight_at_date.unstack().fillna(1)
                        .reindex(df_observations.index, fill_value=1),
                        axis=0
                       )
    

    输出:

    factor_id                      A       B      C     F
    observed_date element_id                             
    2021-01-15    1           0.2610  0.2730  0.048   NaN
                  2           0.8400  0.0500  0.710   NaN
                  3           0.0525  0.1330  0.112   NaN
                  4           0.6000  0.0600    NaN   NaN
                  5           0.0595  0.0945    NaN   NaN
                  6           0.7600  0.9200    NaN   NaN
                  7           0.0300  0.2700    NaN   NaN
    2021-01-16    2           0.9200     NaN    NaN  0.36
                  3           0.8800  0.0500    NaN  0.16
                  4           0.5300  0.2200    NaN   NaN
                  5           0.7900  0.7300    NaN   NaN
                  6           0.1500  0.7000    NaN   NaN
                  7           0.3000  0.9000    NaN   NaN
    

    【讨论】:

    • 感谢您抽出宝贵的时间,但我认为这不会产生所需的输出 - 我用该数据的加速输出更新了帖子
    • 删除fill_value=1内reindex
    • 嗨,当我认为应该是 'NaN's 时,no 仍然会产生 16/1 的值
    • 还要删除fillna(1)?
    【解决方案3】:

    这应该也可以:

    df_weight_at_date.stack().swaplevel().to_frame('A').reindex(df_observations.columns,axis=1).ffill(axis=1).mul(df_observations)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-28
      • 2022-12-17
      • 2012-11-02
      • 2017-11-03
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多