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

如何获取Pandas DataFrame中Group1和Group2列值变化的索引?

实现方法分享

嘿,这个需求在处理分组数据时超常见,用Pandas的内置方法就能轻松搞定!我给你分步骤讲清楚:

1. 核心思路

我们需要逐列对比当前行与前一行的数值,找出数值发生变化的位置索引。关键用到Pandas的shift()方法来偏移列值,再通过布尔索引筛选目标索引。

2. 代码示例

先构造一个样例DataFrame方便演示:

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'Group 1': [1, 1, 2, 2, 3, 3, 3],
    'Group 2': ['A', 'B', 'B', 'C', 'C', 'C', 'A']
})

方法一:包含初始行(索引0)

如果把第一行视为“初始变化点”(因为没有前一行,默认是首次出现),可以这样写:

# 获取Group 1的变化索引
group1_changes = df.index[df['Group 1'] != df['Group 1'].shift(1)].tolist()

# 获取Group 2的变化索引
group2_changes = df.index[df['Group 2'] != df['Group 2'].shift(1)].tolist()

print("Group 1变化索引:", group1_changes)
print("Group 2变化索引:", group2_changes)

输出结果:

Group 1变化索引: [0, 2, 4]
Group 2变化索引: [0, 1, 3, 6]

方法二:仅获取真正的“变化行”(排除第一行)

如果只想找从第二行开始,与前一行数值不同的索引,可以调整为:

# 从索引1开始对比
group1_changes = df.index[1:][df['Group 1'].iloc[1:] != df['Group 1'].iloc[:-1]].tolist()
group2_changes = df.index[1:][df['Group 2'].iloc[1:] != df['Group 2'].iloc[:-1]].tolist()

print("Group 1变化索引:", group1_changes)
print("Group 2变化索引:", group2_changes)

输出结果:

Group 1变化索引: [2, 4]
Group 2变化索引: [1, 3, 6]

3. 扩展:封装成通用函数

如果需要处理更多列,可以封装成函数,避免重复代码:

def get_change_indices(df, column_name, include_first_row=False):
    if include_first_row:
        return df.index[df[column_name] != df[column_name].shift(1)].tolist()
    else:
        return df.index[1:][df[column_name].iloc[1:] != df[column_name].iloc[:-1]].tolist()

# 调用函数
group1_changes = get_change_indices(df, 'Group 1')
group2_changes = get_change_indices(df, 'Group 2')

这样就能根据你的需求灵活获取每一列的变化索引啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:18:42