2 回答

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個贊
首先,獲取共享相同“間隔”值的組中行的位置。
然后,獲取每個組的最后一個值。
你要找的是“l(fā)ast_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貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個贊
創(chuàng)建一個分組系列,該序列通過用 反轉(zhuǎn)來將最后一個非空值與其前面的所有行分組。然后,您可以并用于確定從每行中減去多少。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
因?yàn)?是 NaN 行的子集,所以確保具有值的行保持不變subtfill_value=0
print(subt)
#6 10
#5 20
#4 30
#1 5
#0 10
#Name: interval, dtype: int64
添加回答
舉報(bào)