【问题标题】:Is there a way in Pandas to use previous row values in dataframe.apply where previous values are also calculated in the apply?Pandas 有没有办法在 dataframe.apply 中使用先前的行值,其中先前的值也在应用中计算?
【发布时间】:2019-06-07 04:13:10
【问题描述】:

我有以下数据框:

      W    Y
 0    1    5
 1    2    NaN
 2    3    NaN
 3    4    NaN
 4    5    NaN
 5    6    NaN
 6    7    NaN
 ...

因为表格行一直持续到索引 240。我想获得以下数据框:

      W    Y
 0    1    5
 1    2    7
 2    3    10
 3    4    14
 4    5    19
 5    6    27
 6    7    37
 ...

请注意W 的值是任意的(只是为了使这里的计算更容易,实际上在我的实际程序中它们是np.random.normal)。
或者换句话说:
如果 Y 索引为 0,则 Y 的值为 5;
如果 Y 索引介于 1 和 4(包括)之间,则 Y_i 是 Y 中的前一个元素与 W 中的当前元素之和。
如果 Y 索引 >=5,则 Y 的值为:Y_{i-1} + Y_{i-4} - Y_{i-5} + W_i

使用iipr 回答我已经设法通过运行计算前五个值:

def calculate(add):
    global value
    value = value + add
    return value

df.Y = np.nan
value = 5
df.loc[0, 'Y'] = value
df.loc[1:5, 'Y'] = df.loc[1:5].apply(lambda row: calculate(*row[['W']]), axis=1)

但我还没有设法计算其余的值(其中 index>=5)。
有人有什么建议吗?

【问题讨论】:

  • If Y index is >=5 then the value of Y is: Y_i + Y_{i-4} - Y_{i-5} + W_iY_i 这里是什么?不应该是NaN吗
  • 对不起,我的错,假设是 Y_{i-1},我正在编辑我的问题
  • Y_6=Y_5+Y_2-Y_1+W_6=27+10-7+7=37

标签: python pandas


【解决方案1】:

在这种情况下,我不建议使用 apply
为什么不简单地使用两个循环,每个不同定义的范围一:

for i in df.index[1:5]:
    df.loc[i, 'Y'] = df.W.loc[i] + df.Y.loc[i-1]
for i in df.index[5:]:
    df.loc[i, 'Y'] = df.W.loc[i] + df.Y.loc[i-1] + df.Y.loc[i-4] - df.Y.loc[i-5]

这是直截了当的,下周您仍然知道代码的作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多