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
相关产品推荐
相关产品推荐

