如何将 2 个未对齐的 Pandas 系列相乘并接收具有多索引的产品系列

Posted

技术标签:

【中文标题】如何将 2 个未对齐的 Pandas 系列相乘并接收具有多索引的产品系列【英文标题】:How to multiply 2 non-aligned Pandas series and receive the product-series with multi-index 【发布时间】:2020-07-18 02:38:30 【问题描述】:

我想从 installed_capacity_yearly * full_load_hours_quarterly 计算产生的风能。我有

installed_capacity_yearly = pd.Series(
    data=[12, 15, 21],
    index=[2020, 2021, 2022])

full_load_hours_quarterly = pd.Series(
    data=[900, 700, 600, 800], 
    index=['Q1', 'Q2', 'Q3', 'Q4'])

full_load_hours_quarterly“形状”应在 installed_capacity_yearly 中每年重复。预期的结果应该是这样的

quarterly_energy

year  quarter    volume
2020  Q1         10800
      Q2          8400
      Q3          7200
      Q4          9600
2021  Q1         13500
      Q2         10500
      Q3          9000
      Q4         12000
2022  Q1         18900
      Q2         14700
      Q3         12600
      Q4         16800

【问题讨论】:

【参考方案1】:

你可以使用dot:

(installed_capacity_yearly.to_frame()
    .dot(full_load_hours_quarterly.to_frame().T)
    .stack()
)

输出:

2020  Q1    10800
      Q2     8400
      Q3     7200
      Q4     9600
2021  Q1    13500
      Q2    10500
      Q3     9000
      Q4    12000
2022  Q1    18900
      Q2    14700
      Q3    12600
      Q4    16800
dtype: int64

【讨论】:

干净的解决方案和pandas.DataFrame.dot 矩阵乘法的一个很好的用例。令我惊讶的是,这不适用于不同名称的系列,但我想人们可以忍受。 @Peter 可以通过将相同的name='dummy' 传递给to_frame() 来解决。【参考方案2】:

通过两个索引值创建MultiIndex.from_product,然后使用Series.reindex,最后通过Series.mul创建多个:

mux = pd.MultiIndex.from_product([installed_capacity_yearly.index, 
                                  full_load_hours_quarterly.index])
s1 = installed_capacity_yearly.reindex(mux, level=0)
s2 = full_load_hours_quarterly.reindex(mux, level=1)
s = s1.mul(s2)
print (s)
2020  Q1    10800
      Q2     8400
      Q3     7200
      Q4     9600
2021  Q1    13500
      Q2    10500
      Q3     9000
      Q4    12000
2022  Q1    18900
      Q2    14700
      Q3    12600
      Q4    16800
dtype: int64

【讨论】:

我的想法也朝着这个方向发展,但我更喜欢使用矩阵乘法的解决方案。然而,根据 PEP8,有人可能会争辩说“显式优于隐式” @Peter - 性能怎么样?是否可以在真实数据中进行测试? 每个循环有 10000 个循环 mul: 2.08 ms ± 333 µs per loop vs. `dot: 1.14 ms ± 25.1 µs per loop´。

以上是关于如何将 2 个未对齐的 Pandas 系列相乘并接收具有多索引的产品系列的主要内容,如果未能解决你的问题,请参考以下文章

全网最完整Python数据分析笔记系列工具篇:Pandas

Python pandas:合并两个没有键的表(将 2 个数据帧与广播所有元素相乘;NxN 数据帧)

将 Pandas 数据框中的所有列相乘

将 Pandas 数据框中的所有列相乘

Python Flatten 用 Pandas 将嵌套字典 JSON 相乘

iOS/UIAutomation:如何将 isVisible() 用于第二个未标记工具栏中的按钮?