You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于分组处理Pandas DataFrame的PREV_LOT列,求代码修改方案

实现相邻不同LOT组的上值填充解决方案

当前输出效果

当前代码生成的PREV_LOT列,仅在当前行与上一行LOT值不同时保留上一行值,同一ENTITY内连续相同的LOT组中,仅组内第一行可能有有效值,后续重复行的PREV_LOT均为NaN。

期望输出效果

同一ENTITY内,每个连续相同LOT组的所有行,PREV_LOT都填充为上一个不同LOT组的LOT值;首个组的PREV_LOT保持为NaN。

原代码

import numpy as np
import pandas as pd

group = ['ENTITY']

def shift_if_different(group):
    group['PREV_LOT'] = group['LOT'].shift()
    group['PREV_LOT'] = group.apply(lambda row: row['PREV_LOT'] if row['PREV_LOT'] != row['LOT'] else np.nan, axis=1)
    return group

df = df.groupby(group).apply(shift_if_different)

问题分析

原代码仅逐行对比当前与上一行的LOT值,相同则设为NaN,导致连续相同组内只有第一行可能有有效值,无法实现同一组内共享上一个不同组值的需求。

修改方案(简洁版)

使用np.where生成初始标记后,通过ffill()向前填充NaN,让同一连续组内的所有行继承上一个不同组的LOT值:

import numpy as np
import pandas as pd

group = ['ENTITY']

def fill_prev_lot(group):
    # 生成初始匹配:相邻不同则保留上一行LOT,否则设为NaN
    group['PREV_LOT'] = np.where(group['LOT'] != group['LOT'].shift(), group['LOT'].shift(), np.nan)
    # 向前填充,让同一连续组内的行共享上一个不同组的LOT值
    group['PREV_LOT'] = group['PREV_LOT'].ffill()
    return group

df = df.groupby(group).apply(fill_prev_lot)

修改方案(精准分组版)

如果需要更精准的组级控制,可通过标记连续组的方式实现:

import numpy as np
import pandas as pd

group = ['ENTITY']

def fill_prev_lot(group):
    # 标记连续相同的LOT分组
    group['lot_group'] = (group['LOT'] != group['LOT'].shift()).cumsum()
    # 提取每个分组的首个LOT值,并获取上一个分组的LOT值
    group_meta = group.groupby('lot_group')['LOT'].first().shift().reset_index()
    # 将上一个分组的LOT值映射回原数据
    group = group.merge(group_meta, on='lot_group', how='left').rename(columns={'LOT_y': 'PREV_LOT'})
    # 清理辅助列
    group = group.drop(columns=['lot_group', 'LOT_x'])
    return group

df = df.groupby(group).apply(fill_prev_lot)

内容的提问来源于stack exchange,提问作者user9185511

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:27:20