如何将 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:合并两个没有键的表(将 2 个数据帧与广播所有元素相乘;NxN 数据帧)