如何修正DataFrame中每个id分组最后一行的start_quantity值
解决DataFrame分组最后一行start_quantity赋值NaN问题
你的代码出现NaN的核心原因是:直接将time==9的end_quantity列赋值给time==10的start_quantity时,两个子集的索引无法一一对应,导致不匹配的位置被填充为NaN。必须按id分组对应赋值,以下是两种可行方案:
方案1:利用分组移位(groupby+shift)
每个id组内已按time升序排列,time=10的前一行恰好是time=9,通过分组后移位的方式,可直接将每个组内的end_quantity向上移动一行,对应到下一行的start_quantity:
# 按id分组,将每个组的end_quantity向上移位一行,作为start_quantity df['start_quantity'] = df.groupby('id')['end_quantity'].shift(1) # 保留每个id第一行(time=1)的原始start_quantity值(第一行无前置数据) df.loc[df['time'] == 1, 'start_quantity'] = df.loc[df['time'] == 1, 'start_quantity']
方案2:构建id映射字典精准赋值
先提取每个id对应的time=9的end_quantity值生成映射字典,再为time=10的行按id匹配赋值:
# 生成id到time=9的end_quantity的映射字典 id_end_q_map = df[df['time'] == 9].set_index('id')['end_quantity'].to_dict() # 为time=10的行按id匹配赋值start_quantity df.loc[df['time'] == 10, 'start_quantity'] = df.loc[df['time'] == 10, 'id'].map(id_end_q_map)
两种方案都能确保每个time=10的行精准拿到对应id的time=9的end_quantity值,不会出现NaN。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

