[英]Using values from previous rows when using Pandas Apply Function
嗨,我正在尝试为时间序列 Pandas 数据框创建新列,该数据框本质上是跟踪电池的充电和放电。 我可以让它与 iterrows 一起工作,但正如你所料,它在大时间序列上非常慢。 从一些互联网搜索中,我认为应用是要走的路(或者不是,我希望你能指出我正确的方向),但我在尝试访问上一个时间步的值时遇到了麻烦。 我创建了这段非常简化的代码,试图捕捉我试图做的事情。 基本上我无法弄清楚如何将我在前一行计算的“结束”值传递给下一行的“开始”值。
df = pd.DataFrame(data = {'NetPosition': [-10, -5, 10], 'row_no': [0,1,2]})
df['start'] = 0
df['end'] = 0
df['dispatch'] = 0
starting_value = 20
max_rating = 4
def f(x):
prev_index = max(0,int(x.row_no-1))
if x.row_no == 0:
start = starting_value
else:
start = df['end'].iloc[prev_index]
# this is the part that doesn't work - im attempting to pull the end value from the previous row into the new next row
if x['NetPosition']<0:
dispatch = min(np.abs(x['NetPosition']), max_rating, start)
end = start - dispatch
else:
dispatch = 0
end = start
return pd.Series([start,end,dispatch])
df[['start','end','dispatch']] = df.apply(lambda x: f(x), axis=1)
df
使用 pd.shift(1) 获取顶部的最后一个值。 使用 pd.shift(-1) 获取下面的下一行。 在 excel 中使用类似于 =IF 函数的 np.where。
import pandas as pd
import numpy as np
df = pd.DataFrame(data = {'NetPosition': [-10, -5, 10], 'row_no': [0,1,2]})
df['start'] = 0
df['end'] = 0
df['dispatch'] = 0
starting_value = 20
max_rating = 4
#Answer
df.dispatch = np.where(df.NetPosition < 0, min(max_rating,df['NetPosition'].abs().min()) ,0)
df.start = df.end.shift(1)
df.start = df.start.fillna(20)
df.end = np.where(df.NetPosition < 0, df.start, df.start - df.dispatch)
df
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.