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

Pandas:查找DataFrame中列值发生变化时的索引值

问题:获取DataFrame中列值变化时的索引列表

给定如下DataFrame:

import pandas as pd
df1 = pd.DataFrame({
    'col_1': [4.0, 4.0, 49.0, 49.0, 52.0, 52.0, 32.0],
    'val_1': [0.89, 0.56, 0.7, 1.23, 0.8, 0.12, 0.5]
})

需求是找到col_1列值发生变化时的索引,将结果整理为列表或numpy数组。

尝试过以下代码,但返回元组形式的数组,不便遍历:

import numpy as np
n_change = (np.where(~df1.col_1.diff(+1).isin([0, np.nan])))

期望结果为:

n_change = [2,4,6]
# 或
n_change = array([2,4,6])

解决方法

方法1:优化原代码,提取数组并转列表

np.where返回的是包含数组的元组,只需取元组的第一个元素,再转成列表即可:

n_change = np.where(~df1.col_1.diff().isin([0, np.nan]))[0].tolist()
# 结果:[2, 4, 6]

方法2:用pandas布尔索引直接取索引(更直观)

通过shift()将上一行的值下移,对比当前行与上一行的值,筛选出不等的行并提取索引:

# 获取索引列表
n_change = df1[df1['col_1'] != df1['col_1'].shift()].index.tolist()

# 获取numpy数组
n_change = df1[df1['col_1'] != df1['col_1'].shift()].index.to_numpy()

这种方式逻辑更清晰,纯pandas操作即可完成,无需依赖numpy的where方法。

方法3:利用diff()的结果直接筛选

diff()返回当前行与前一行的差值,当差值不为0且不为NaN时,就是值发生变化的位置:

# 生成布尔掩码
mask = df1['col_1'].diff().ne(0) & df1['col_1'].diff().notna()
# 提取索引
n_change = df1[mask].index.tolist()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:55:17