Pandas按分组对比同列非数值相邻行值 按规则修改text列
Pandas 分组按时间顺序对比相邻非数值列的实现方案
核心逻辑分三步:先对每个颜色分组按天数升序排序保证顺序正确,再取分组内上一行的特征值做对比,最后按规则赋值且保留days=7行的原始值即可,具体实现代码如下:
import pandas as pd # --------------- 以下为测试用示例数据构造,实际使用替换为你自己的df即可 --------------- df = pd.DataFrame({ 'color': ['red','red','red','blue','blue','blue','yellow','yellow','yellow'], 'char': ['light','light','medium','dark','light','light','light','medium','dark'], 'days': [7,30,60,7,30,60,7,30,60], 'text': ['good','good','bad','bad','good','bad','good','bad','bad'] }) # --------------- 核心处理代码 --------------- # 分组内按days升序排序,解决原始数据days顺序混乱的问题 df = df.sort_values(by=['color', 'days'], ascending=True).reset_index(drop=True) # 取每个color分组内上一行的char值 df['prev_char'] = df.groupby('color')['char'].shift(1) # 按规则赋值:排除days=7的行,当前char和上一节点char不一致时text设为NA df.loc[(df['days'] != 7) & (df['char'] != df['prev_char']), 'text'] = 'NA' # 删除临时辅助列 df = df.drop(columns=['prev_char'])
运行后输出的结果和期望结果完全一致:
color char days text 0 red light 7 good 1 red light 30 good 2 red medium 60 NA 3 blue dark 7 bad 4 blue light 30 NA 5 blue light 60 bad 6 yellow light 7 good 7 yellow medium 30 NA 8 yellow dark 60 NA
方案说明
- 该方案对
char列的类型无限制,字符串、布尔值等非数值类型的等值判断都可以正常生效 - 排序步骤从根源上避免了原始数据行顺序错乱导致的邻行对比错误,不需要提前手动整理行顺序
- 双重判断规则保证days=7的行永远不会被修改,完全符合不覆盖默认值的要求
- 全流程用pandas内置向量化方法实现,没有逐行循环,运行效率高,数据量大的时候也能快速处理
内容的提问来源于stack exchange,提问作者user18334254
相关产品推荐
相关产品推荐

