![](/img/trans.png)
[英]How to apply array function (previous row calculation) with pandas group by
[英]Referencing previous row in Pandas apply function logic
我正在尝试创建一个剪辑的 cumsum。 但是,裁剪是基于前一行的值。
下面是我尝试生成的数据示例。
╔══════╦═══════════════════╦═════════════════════╦════════════╦═══════════╦══════════════════╗
║ Idx ║ datetime ║ energy_consumption ║ energy_pv ║ spare_pv ║ cumsum_spare_pv ║
╠══════╬═══════════════════╬═════════════════════╬════════════╬═══════════╬══════════════════╣
║ 1 ║ 18/09/2021 04:00 ║ 15.5 ║ 0 ║ -15.5 ║ 42.546 ║
║ 2 ║ 18/09/2021 05:00 ║ 15.2 ║ 0 ║ -15.2 ║ 27.346 ║
║ 3 ║ 18/09/2021 06:00 ║ 15.5 ║ 0.667 ║ -14.833 ║ 12.513 ║
║ 4 ║ 18/09/2021 07:00 ║ 15.1 ║ 5.598 ║ -9.502 ║ 3.011 ║
║ 5 ║ 18/09/2021 08:00 ║ 17.1 ║ 10.638 ║ -6.462 ║ 0 ║
║ 6 ║ 18/09/2021 09:00 ║ 17.4 ║ 15.146 ║ -2.254 ║ 0 ║
║ 7 ║ 18/09/2021 10:00 ║ 17.5 ║ 19.44 ║ 1.94 ║ 1.94 ║
║ 8 ║ 18/09/2021 11:00 ║ 18.1 ║ 23.226 ║ 5.126 ║ 7.066 ║
║ 9 ║ 18/09/2021 12:00 ║ 19.5 ║ 26.246 ║ 6.746 ║ 13.812 ║
║ 10 ║ 18/09/2021 13:00 ║ 20.5 ║ 26.864 ║ 6.364 ║ 20.176 ║
║ 11 ║ 18/09/2021 14:00 ║ 19.6 ║ 24.792 ║ 5.192 ║ 25.368 ║
║ 12 ║ 18/09/2021 15:00 ║ 18.4 ║ 18.869 ║ 0.469 ║ 25.837 ║
║ 13 ║ 18/09/2021 16:00 ║ 18.3 ║ 12.319 ║ -5.981 ║ 19.856 ║
║ 14 ║ 18/09/2021 17:00 ║ 19.4 ║ 4.637 ║ -14.763 ║ 5.093 ║
║ 15 ║ 18/09/2021 18:00 ║ 18.7 ║ 0 ║ -18.7 ║ 0 ║
║ 16 ║ 18/09/2021 19:00 ║ 18.8 ║ 0 ║ -18.8 ║ 0 ║
╚══════╩═══════════════════╩═════════════════════╩════════════╩═══════════╩══════════════════╝
我有能耗和光伏列。 spare_pv
很容易生成使用:
df['PV'] - df['energy_consumption']
但是,我无法弄清楚如何创建 cumsum 列。 这不能使用pd.Series.cumsum()
来完成,因为如果上面的行是0
,则需要逻辑来裁剪该值。 我有一个 excel 公式,我目前正在使用它来生成这个 function。 对于此示例,列是:
A: Idx, B: datetime, C: energy_consumption, D: energy_pv, E: spare_pv, F: cumsum_spare_pv
最初将计算第 1 行,然后第 2 行将具有以下公式:
=IF((E2+F1)<=0, 0, E2+F1)
我可以通过创建一个列表并将 DF 循环到 append 值来做到这一点(类似于此处建议的方式),但考虑到这个数据集有数十万行,这将非常慢。
由于 cumsum 是有条件的,我认为没有办法循环它。
与其使用 iloc 并为此目的(这很慢),不如使用 numpy 来代替。
D = df['spare_pv'].values
# D = np.random.random(5000000)-0.5
start_value = 42.546+15.5
new_val = start_value+D[0]
D[0] = new_val if new_val >0 else 0
for i in range(1,len(D)):
new_val = D[i]+D[i-1]
D[i] = new_val if new_val >0 else 0
df['cumsum_spare_pv'] = D
我也对随机的 500 万个值尝试了这个操作,它在 3 秒左右完成,所以应该还可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.