基于分组处理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
相关产品推荐
相关产品推荐

