【问题标题】:Replace the value with the sum of two previous values in python by group按组将值替换为python中两个先前值的总和
【发布时间】:2020-07-20 22:34:10
【问题描述】:

我有以下数据集:

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”替换为先前值的总和,然后重新开始。例如,

如果 Date= '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

如果日期 = '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 中做到这一点?

【问题讨论】:

    标签: python loops cumsum


    【解决方案1】:

    下面是迭代解,假设每组的前两个值不是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'] 
    

    【讨论】:

    • 谢谢你,普拉莫特。它有很大帮助。在这种情况下我是否需要使用 groupby('id') ?我只是想确保 i-1 和 i-2 值不是来自其他客户。
    • 为确保您可以按 id 分组,也可以使用 df.sort_values('id') 。
    • 非常感谢。
    • 嗨 Pramote,我应该在哪里输入 'groupby(['id'])?
    • 如果group的前两个值不是NaN,在idx = ...之前使用df = df.sort_values('id')会更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2020-05-21
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2019-03-24
    相关资源
    最近更新 更多