2 回答
TA贡献1719条经验 获得超6个赞
首先,获取共享相同“间隔”值的组中行的位置。
然后,获取每个组的最后一个值。
你要找的是“last_value - pos * interval”
df = df.reset_index()
grouped_df = df.groupby(['interval'])
df['pos'] = grouped_df['index'].rank(method='first', ascending=False) - 1
df['last'] = grouped_df['value'].transform('last')
df['value'] = df['last'] - df['interval'] * df['pos']
del df['pos'], df['last'], df['index']
TA贡献1883条经验 获得超3个赞
创建一个分组系列,该序列通过用 反转来将最后一个非空值与其前面的所有行分组。然后,您可以并用于确定从每行中减去多少。NaN[::-1]bfillcumsum
s = df['value'].notnull()[::-1].cumsum()
subt = df.loc[df['value'].isnull(), 'interval'][::-1].groupby(s).cumsum()
df['value'] = df.groupby(s)['value'].bfill().subtract(subt, fill_value=0)
value interval
0 2005.0 5
1 2010.0 5
2 2015.0 5
3 2020.0 5
4 2060.0 10
5 2070.0 10
6 2080.0 10
7 2090.0 10
8 2100.0 10
因为 是 NaN 行的子集,所以确保具有值的行保持不变subtfill_value=0
print(subt)
#6 10
#5 20
#4 30
#1 5
#0 10
#Name: interval, dtype: int64
添加回答
举报