python - 按组将值替换为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)
)
但它不起作用。我应该得到的数据如下:
解决方案
下面是一个迭代解,假设每组的前两个值不是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']
推荐阅读
- linux - ncap2:加载共享库时出错:libnetcdf.so.7:无法打开共享对象文件:没有这样的文件或目录
- laravel - Laravel 的多态多对多比我聪明
- java - 未从字典中返回有效单词
- auth0 - Auth0 无密码到新电子邮件地址
- c# - 自定义列上的一对多关系
- html - Flexbox:在移动设备上将 2 列折叠为单列,但重新排列元素
- python - 不明白这个 TypeError 的原因:'dict' object is not callable
- powershell - 如何在 azure powershell 脚本任务中提供 json 请求正文
- javascript - 通过firebase函数调度谷歌云任务时出错,但从任务仪表板调度时没有错误
- ios - 屏幕顶部的额外空间