如何简便计算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
相关产品推荐
相关产品推荐

