如何查询Pandas DataFrame中正负值交替转换的首个元素索引
解决Pandas中正负值块切换的首个元素索引问题
核心思路
通过判断值的符号变化,定位正负块切换的边界点,筛选出符合要求的索引。以下是具体步骤和代码示例:
1. 准备示例数据
先创建一个包含交替正负值块的DataFrame,方便演示:
import pandas as pd import numpy as np data = {'values': [1, 2, 3, -1, -2, 4, 5, -3, -4, -5, 6]} df = pd.DataFrame(data)
2. 标记符号与符号变化
- 用
np.sign()生成每个值的符号(1为正,-1为负,0为零) - 用
diff()计算当前行与前一行的符号差异,差异不为0则说明发生了正负切换
# 生成符号列 df['sign'] = np.sign(df['values']) # 标记符号切换的行 df['sign_change'] = df['sign'].diff() != 0
3. 筛选目标索引
负值块后的首个正值索引
筛选条件:符号发生切换、当前值为正、排除第一行(因为第一行前无负值块)
positive_starts = df[(df['sign_change']) & (df['sign'] == 1) & (df.index != 0)].index print("负值块后的首个正值索引:", positive_starts) # 输出:负值块后的首个正值索引: Int64Index([5, 10], dtype='int64')
正值块后的首个负值索引
筛选条件:符号发生切换、当前值为负、排除第一行(因为第一行前无正值块)
negative_starts = df[(df['sign_change']) & (df['sign'] == -1) & (df.index != 0)].index print("正值块后的首个负值索引:", negative_starts) # 输出:正值块后的首个负值索引: Int64Index([3, 7], dtype='int64')
处理特殊情况
如果数据中包含零,np.sign()会返回0,可根据需求提前过滤零值,或调整符号判断逻辑:
# 过滤所有零值行 df = df[df['values'] != 0]
内容的提问来源于stack exchange,提问作者user206545
相关产品推荐
相关产品推荐

