识别ColA连续数列并提取对应Freq1中间值,排查代码无输出问题
问题分析与解决方案
原代码的核心错误
你的代码逻辑存在根本性问题:
- 遍历
df.ColA的单个值时,col == col + 1这个条件永远不可能成立,单个数值不可能等于自身加1。 - 没有关联前后行的数据,无法识别连续数字序列。
正确实现方案
我们可以利用Pandas的分组功能来识别连续序列,再提取中间数对应的Freq1值,步骤如下:
1. 构造测试数据
import pandas as pd data = { 'ColA': [4, 5, 6, 18, 19, 20], 'Freq1': [0, 100, 200, 5, 600, 700] } df = pd.DataFrame(data)
2. 标记连续序列分组
通过计算相邻行ColA的差值,将连续数字划分为同一分组:
# 当当前行与前一行ColA差值≠1时,标记为新分组起点,生成分组ID df['group_id'] = (df['ColA'].diff() != 1).cumsum()
3. 筛选有效分组并提取中间值
我们只保留长度为奇数的分组(确保存在中间数),然后提取每个分组中间行的Freq1:
# 统计每个分组的长度 group_lengths = df.groupby('group_id')['ColA'].count() # 筛选出长度为奇数的分组(这里测试数据都是长度3,也可直接筛选length==3) valid_groups = group_lengths[group_lengths % 2 == 1].index # 提取每个有效分组的中间行的Freq1 result = df[df['group_id'].isin(valid_groups)].groupby('group_id').apply( lambda x: x.iloc[len(x)//2]['Freq1'] ).tolist() print(result) # 输出: [100, 600]
代码说明
df['ColA'].diff():计算当前行与前一行ColA的差值,差值为1说明是连续数字。(df['ColA'].diff() !=1).cumsum():将非连续的位置标记为1,累加后生成唯一的分组ID,连续数字会被分到同一组。x.iloc[len(x)//2]:对于长度为n的分组,中间位置的索引为n//2(比如n=3时,索引为1,对应第二个元素)。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

