gpt4 book ai didi

python-3.x - 基于映射的列乘法

转载 作者:行者123 更新时间:2023-12-02 01:51:26 24 4
gpt4 key购买 nike

我有以下两个数据框。第一个,将一些节点映射到区域号和该节点的最大电力负载。

bus = pd.DataFrame(data={'Node':[101, 102, 103, 104, 105], 'Area':[1, 1, 2, 2, 3], 'Load':[10, 15, 12, 20, 25]})

这给了我们:

   Bus  Area  Load
0 101 1 10
1 102 1 15
2 103 2 12
3 104 2 20
4 105 3 25

第二个数据框显示一段时间内(从 0 点到 5 点)每个区域的总电力负荷。列名称是区域(与数据帧 bus 中的列 Area 匹配。

load = pd.DataFrame(data={1:[20, 18, 17, 19, 22, 25], 2:[23, 25,24, 27, 30, 32], 3:[10, 14, 19, 25, 22, 20]})

这给了我们:

    1   2   3
0 20 23 10
1 18 25 14
2 17 24 19
3 19 27 25
4 22 30 22
5 25 32 20

我想要一个数据框来显示每辆公交车在 6 小时内的电力负载。假设:负载随时间变化的百分比与bus中显示的最大负载的百分比相同;例如,101路公交车的电负荷占区域1的电负荷的10/(10+15)=0.4%,因此,要计算其每小时负荷,应将10/(10+15)乘以区域1对应的列加载

所需的输出应采用以下格式:

    101     102     103     104     105
0 8 12 8.625 14.375 10
1 7.2 10.8 9.375 15.625 14
2 6.8 10.2 9 15 19
3 7.6 11.4 10.125 16.875 25
4 8.8 13.2 11.25 18.75 22
5 10 15 12 20 20

对于第 101 列,我们将 0.4 乘以 load 的第 1 列。

非常感谢任何帮助。

最佳答案

一种选择是获取 Load 除以 sum,然后进行透视,获取 load 的索引匹配总线,在乘以匹配级别之前:

(bus.assign(Load = bus.Load.div(bus.groupby('Area').Load.transform('sum')))
.pivot(None, ['Area', 'Node'], 'Load')
.reindex(load.index)
.ffill() # get the data spread into all rows
.bfill()
.mul(load, level=0)
.droplevel(0,1)
.rename_axis(columns=None)
)
101 102 103 104 105
0 8.0 12.0 8.625 14.375 10.0
1 7.2 10.8 9.375 15.625 14.0
2 6.8 10.2 9.000 15.000 19.0
3 7.6 11.4 10.125 16.875 25.0
4 8.8 13.2 11.250 18.750 22.0
5 10.0 15.0 12.000 20.000 20.0

关于python-3.x - 基于映射的列乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70297254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com