如何在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']])
代码说明
- 窗口范围控制:通过
max和min函数确保窗口不会超出DataFrame的首尾边界 - 符号处理:用
np.sign()快速生成数值符号,0的处理逻辑可根据业务需求修改 - 突变检测:通过
diff()对比相邻元素符号,统计变化次数判断是否符合条件 - 结果返回:仅在单次突变时返回突变行索引,其余情况返回原目标索引值
内容的提问来源于stack exchange,提问作者user15649753
相关产品推荐
相关产品推荐

