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

如何简便计算DataFrame指定列的数值变化次数

如何以最简单的方式计算DataFrame指定列中的数值变化次数?

先来看你给出的示例数据:

a b
0 1
1 1
2 1
3 2
4 1
5 2
6 2
7 3
8 3
9 3 

你提到列b的数值共变化4次,这个判断完全正确——对应1→2、2→1、1→2、2→3这四次相邻数值的变动。

你的循环解决方案是可行的,但其实pandas有更简洁高效的矢量化方法,不需要手动遍历每一行,尤其适合处理大规模数据集:

推荐的简洁实现方法

方法1:利用diff()判断差值变化

我们可以通过计算相邻元素的差值,统计差值不为0的次数(也就是数值发生变化的次数):

# 写法1:去掉空值后直接统计
change_count = df['b'].diff().dropna().ne(0).sum()

# 写法2:先统计再修正第一行的空值影响
change_count = df['b'].diff().ne(0).sum() - 1

两种写法都能得到结果4。具体原理:

  • df['b'].diff() 会计算当前元素与前一个元素的差值,第一行因没有前置元素会得到NaN
  • .ne(0) 筛选出差值不等于0的情况(即数值发生了变化)
  • 第一种写法用dropna()去掉第一行的NaN后求和;第二种写法先求和再减去第一行被误统计的1次,结果完全一致

方法2:用shift()做相邻元素比较

另一种思路是把列向下偏移一行,再和原列比较,统计不相等的次数:

# 写法1:去掉空值后直接统计
change_count = df['b'].ne(df['b'].shift()).dropna().sum()

# 写法2:先统计再修正第一行的空值影响
change_count = df['b'].ne(df['b'].shift()).sum() - 1

原理类似:

  • df['b'].shift() 把列整体下移一行,第一行变成NaN
  • .ne() 比较原列和偏移后的列,不相等就说明数值发生了变化
  • 同样通过去掉空值或者减1来修正第一行的干扰

为什么推荐矢量化方法?

相比你的循环写法,这些方法有两个明显优势:

  • 速度更快:pandas的矢量化操作是底层优化过的,处理几万甚至几十万行数据时,比手动循环快几个数量级
  • 代码更简洁:一行代码就能完成逻辑,可读性和维护性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:33:34