首页 > 解决方案 > 按组将值替换为python中两个先前值的总和

问题描述

我有以下数据集:

import numpy as np
import pandas as pd

df = pd.DataFrame ({'Date':['2000-01-01', '2000-02-01', '2000-03-01','2000-04-01','2000-05-01',
                             '2000-01-01', '2000-02-01','2000-03-01'
                           
                           ],
                  
                     'id':['1', '1', '1', '1','1','2', '2', '2'],
                   
                    'error': [0, 0.8, 'nan', 'nan', 'nan', 2.5, 0.25, 'nan']


                                     
                    })

我需要将“nan”替换为先前值的总和,然后重新开始。例如,

如果日期 = '2000-03-01' 并且 id = 1,则错误 = 0.1 * 0.8 + 0.2 * 0 =0.08

如果 Date = '2000-04-01' 并且 id = 1,则错误 = 0.1 * 0.08 + 0.2 * 0.8 = 0.168

如果 Date = '2000-05-01 并且 id = 1,则错误 = 0.1 * 0.168 + 0.2 * 0.08 = 0.0328 等。

我尝试执行以下操作:

df['error'] = pd.to_numeric(df.error, errors = 'coerce')

df['error'] =(df.groupby('id')
    .apply(lambda x: 0.1*x.error.shift(1) + 0.2 * x.error.shift(2).cumsum())
    .reset_index('id', drop = True)
    )

但它不起作用。我应该得到的数据如下:

有谁知道如何在 Python 中做到这一点? 在此处输入图像描述

标签: pythonloopscumsum

解决方案


下面是一个迭代解,假设每组的前两个值不是nan。

df = pd.DataFrame({'Date': ['2000-01-01', '2000-02-01', '2000-03-01', '2000-04-01', '2000-05-01',
                            '2000-01-01', '2000-02-01', '2000-03-01'
                            ],
                   'id': ['1', '1', '1', '1', '1', '2', '2', '2'],
                   'error': [0, 0.8, np.nan, np.nan, np.nan, 2.5, 0.25, np.nan]
                   })

idx = df[df['error'].isna()].index 
for i in idx: 
     df.loc[i, 'error'] = 0.1*df.loc[i-1, 'error'] + 0.2*df.loc[i-2, 'error'] 

推荐阅读