如何获取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
相关产品推荐
相关产品推荐

