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

如何在Pandas中使用向量化计算检测值或类别的变化并修正首行误判

如何在Pandas中使用向量化计算检测值或类别的变化并修正首行误判

我完全理解你的困扰——用Pandas分组检测值变化时,每个分组的第一行总是被误判为True,这是因为shift()会让第一行的前置值变成NaN,而NaN和任何值比较都会得到True,但实际上第一条记录没有前置数据,根本谈不上“变化”。下面我给你两种简洁的解决方案,完美解决这个首行误判的问题。

方案一:在Transform中直接修正(推荐)

我们可以利用Pandas的ne()(不等于)和where()函数,在分组计算时直接把第一行的结果设为False:

import pandas as pd
import numpy as np

test_df = pd.DataFrame({'item': [20, 20, 20, 20, 20, 20, 20, 20, 30, 30, 30, 30, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40, 40, 40 ],
                        'measure': [1, 1, 1, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10 ],
                        'cat': ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e']})

# 修正measure_change的计算
test_df['measure_change'] = test_df.groupby('item')['measure'].transform(
    lambda x: x.ne(x.shift()).where(x.shift().notna(), False)
)

# 同理处理cat_change
test_df['cat_change'] = test_df.groupby('item')['cat'].transform(
    lambda x: x.ne(x.shift()).where(x.shift().notna(), False)
)

原理说明:

  • x.ne(x.shift()):计算当前值和前一个值是否不等,得到布尔序列;
  • x.shift().notna():判断前一个值是否存在(即不是第一行);
  • where(条件, 替代值):当条件满足时保留原结果,不满足时(第一行)用False替代,完美跳过首行的误判。

方案二:先计算再修正首行

如果你觉得上面的lambda不够直观,也可以分两步走:先按原来的方式计算变化,再把每个分组的第一行强制设为False:

# 先计算初始变化
test_df['measure_change'] = test_df.groupby('item')['measure'].transform(lambda x: x.ne(x.shift()))
# 获取每个分组的第一行索引,设为False
first_rows = test_df.groupby('item').head(1).index
test_df.loc[first_rows, 'measure_change'] = False

# cat_change同理
test_df['cat_change'] = test_df.groupby('item')['cat'].transform(lambda x: x.ne(x.shift()))
test_df.loc[first_rows, 'cat_change'] = False

验证结果

处理后的measure_change列会符合你的预期:

  • Item20的第一行(索引0)为False,索引3(从1变3)为True;
  • Item30的第一行(索引8)为False,索引13(从6变7)为True;
  • Item40的所有行都是False(因为没有任何变化)。

处理NaN/NULL的情况

针对你提到的“检测值变为NaN”的场景,这个方案也完全适用:如果某个分组中后续值变成了NaN,x.ne(x.shift())会返回True,因为NaN和之前的非NaN值不等,这正是我们需要的“变化”标记。

备注:内容来源于stack exchange,提问作者hydrodan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:48:09