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

如何在Pandas中按符号变化规则确定目标行索引?

在Pandas中实现符号突变点检测逻辑

需求说明

针对包含目标索引列(ind_column)的DataFrame,对col1列执行以下逻辑:

  • 以目标索引所在行为中心,查看前后各3行的范围(即共7行:中心行-3到中心行+3)
  • 若该范围内col1的符号仅发生一次突变,且突变前后符号均保持恒定,则选取符号突变的行索引
  • 若范围内无符号突变或多次突变,则保留原ind_column的值

示例说明

示例1:存在单次符号突变

ind_column     col1
4             0.5
4             0.65
4             0.6
4             0.2
4             0.1
4             0.8
4             -0.3
4             -0.2
4             -0.3

目标索引为4,查看其前后3行(行1到行7),第6行发生符号突变(突变前全为正,突变后全为负),最终选取第6行索引。

示例2:存在多次符号突变

ind_column     col1
5             0.5
5             0.65
5             -0.6
5             0.2
5             -0.1
5             0.8
5             0.3
5             -0.2
5             -0.3

查看索引5的前后3行(行2到行8),范围内符号多次突变,最终保留原索引5。

示例3:无符号突变

ind_column     col1
5             0.5
5             0.65
5             0.6
5             0.2
5             0.1
5             0.8
5             0.3
5             0.2
5             0.3

范围内符号未发生变化,最终保留原索引5。

实现代码

import pandas as pd
import numpy as np

def find_mutation_index(row, df, window_size=3):
    # 获取当前行的位置
    center_idx = row.name
    # 计算窗口的起始和结束索引,避免超出DataFrame范围
    start_idx = max(0, center_idx - window_size)
    end_idx = min(len(df)-1, center_idx + window_size)
    # 提取窗口内的col1数据
    window_data = df.loc[start_idx:end_idx, 'col1']
    
    # 生成符号序列:正为1,负为-1,0统一按正处理(可按需调整)
    sign_series = np.sign(window_data).replace(0, 1)
    # 标记符号变化位置:相邻符号不同则为1,否则为0
    sign_changes = sign_series.diff().ne(0).astype(int).dropna()
    
    # 统计符号变化次数
    change_count = sign_changes.sum()
    
    if change_count == 1:
        # 获取突变行的索引
        mutation_pos = sign_changes[sign_changes == 1].index[0]
        return mutation_pos
    else:
        # 无突变或多次突变,返回原索引列值
        return row['ind_column']

# 测试示例1
df1 = pd.DataFrame({
    'ind_column': [4]*9,
    'col1': [0.5, 0.65, 0.6, 0.2, 0.1, 0.8, -0.3, -0.2, -0.3]
})
df1['result_index'] = df1.apply(find_mutation_index, df=df1, axis=1)
print("示例1结果:")
print(df1[['ind_column', 'col1', 'result_index']])

# 测试示例2
df2 = pd.DataFrame({
    'ind_column': [5]*9,
    'col1': [0.5, 0.65, -0.6, 0.2, -0.1, 0.8, 0.3, -0.2, -0.3]
})
df2['result_index'] = df2.apply(find_mutation_index, df=df2, axis=1)
print("\n示例2结果:")
print(df2[['ind_column', 'col1', 'result_index']])

# 测试示例3
df3 = pd.DataFrame({
    'ind_column': [5]*9,
    'col1': [0.5, 0.65, 0.6, 0.2, 0.1, 0.8, 0.3, 0.2, 0.3]
})
df3['result_index'] = df3.apply(find_mutation_index, df=df3, axis=1)
print("\n示例3结果:")
print(df3[['ind_column', 'col1', 'result_index']])

代码说明

  1. 窗口范围控制:通过max和min函数确保窗口不会超出DataFrame的首尾边界
  2. 符号处理:用np.sign()快速生成数值符号,0的处理逻辑可根据业务需求修改
  3. 突变检测:通过diff()对比相邻元素符号,统计变化次数判断是否符合条件
  4. 结果返回:仅在单次突变时返回突变行索引,其余情况返回原目标索引值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:35:26