【问题标题】:How to use a previous row value in a pandas dataframe when the previous value is also calculated witht group data当还使用组数据计算前一个值时,如何在熊猫数据框中使用前一行值
【发布时间】:2020-07-23 08:56:05
【问题描述】:

我有这样的DataFrame:

df = pd.DataFrame({'id': [111,111,111, 222,222,222],\
                   'Date': ['30.04.2020', '31.05.2020', '30.06.2020', \
                            '30.04.2020', '31.05.2020', '30.06.2020'],\
                   'Debt': [100,100,70, 200,200,200] , \
                   'Ear_coef': [0,0.2,0.2, 0,0,0.3]}) 
df['Date'] = pd.to_datetime(df['Date'] ) 
df['Contract'] = pd.DataFrame(df.groupby(['id']).apply(lambda x: x.Debt - x.Debt.shift(1))).reset_index().Debt
# df.groupby(['id']).
df 

我需要得到这样的DataFrame:

起始DataFrame:

  • 第一列是合同 ID;
  • 第二列是日期;
  • 第三列是预付款系数 (EAR);
  • 第 4 列是合同付款;

结果数据框:

  • 第 5 列是 EAR。它等于 Ear_coef(t) * Debt_with_EAR(t-1)
  • 第 6 列是 Debt_with_EAR。它等于 Debt_with_EAR(t-1)+Contract(t)+EAR(t)

Ear 和 Debt_with_EAR at first date 分别等于 0 和 Debt at。

我尝试使用 apply 来解决此类任务。但是我没有成功,因为我需要使用以前计算的值。 这个答案对我没有帮助Is there a way in Pandas to use previous row value in dataframe.apply when previous value is also calculated in the apply? 因为我有数百个 id。

我将不胜感激。

【问题讨论】:

    标签: python pandas lambda iteration apply


    【解决方案1】:

    您正在寻找.shift()

    然而,它并不适合.apply()。解决方法是:

    df['EAR'] = df['EAR_coef'] * df['Debt with EAR'].shift(1)
    

    对于您的最后一列,您可能需要.rolling(),但我不确定您的公式?似乎永无止境。

    【讨论】:

    • 您的方法不起作用,因为您不知道 df['Debt with EAR'] 的所有预测范围。例如,对于 id 111,使用您的方法 df['EAR'] = [NaN, 20,NaN ]。这是不正确的。
    • 是的,但这是您的公式的问题; EAR 依赖于 Debt_with_EARDebt_with_EAR 依赖于 EAR
    • 正如我在第一次描述 EarDebt_with_EAR 时分别等于 0 和 Debt 在。但是在第二个日期,我可以在开头计算EAR,然后我可以计算Debt_with_EAR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多