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

按alpha_3_id分组验证DataFrame中id列数值的连续性

按分组验证DataFrame中id列的连续性

问题场景

现有如下结构的pandas DataFrame:

import pandas as pd

data = {'alpha_3_id': ['LIA', 'LIA', 'LIA', 'LIA', 'MIL', 'MIL', 'DEA', 'DEA', 'DEA', 'DEA'],
        'id': [1, 2, 3, 4, 1, 2, 1, 2, 3, 4]
       }
df = pd.DataFrame(data)

需要验证每个alpha_3_id分组下,id列的数值是否按连续顺序排列。此前尝试的代码仅能校验整列的连续性,无法实现分组校验:

all(j == i + 1 for i, j in zip(list_of_values, list_of_values[1:]))

解决方案

方法1:分组+自定义校验函数

把连续性校验逻辑封装成函数,通过groupby.apply对每个分组单独校验:

def is_continuous(series):
    # 先排序分组内的id(若原数据已保证分组内有序可省略)
    sorted_ids = series.sort_values().reset_index(drop=True)
    # 校验规则:相邻元素差为1,且从1开始连续(无需从1开始可去掉后半段)
    return all(sorted_ids.diff().dropna() == 1) and (sorted_ids.iloc[0] == 1)

# 生成每个分组的校验结果
check_result = df.groupby('alpha_3_id')['id'].apply(is_continuous)
print(check_result)

输出结果:

alpha_3_id
DEA     True
LIA     True
MIL     True
Name: id, dtype: bool

方法2:向量化分组校验(高效适用于大数据)

用pandas内置的分组和差值计算实现无循环校验,性能更优:

# 先按分组+id排序(确保分组内id有序)
df_sorted = df.sort_values(['alpha_3_id', 'id']).reset_index(drop=True)
# 计算分组内id的相邻差值
df_sorted['id_diff'] = df_sorted.groupby('alpha_3_id')['id'].diff()

# 聚合校验结果
continuous_check = (
    df_sorted.groupby('alpha_3_id')
    .agg(
        all_diff_valid=('id_diff', lambda x: x.dropna().eq(1).all()),
        starts_at_one=('id', lambda x: x.iloc[0] == 1)
    )
    .assign(is_continuous=lambda x: x.all_diff_valid & x.starts_at_one)
)
print(continuous_check['is_continuous'])

输出与方法1一致,无需自定义函数,适合处理大规模数据。

补充说明

  • 若原始数据已确保每个分组内的id按顺序排列,可跳过排序步骤直接校验。
  • 若仅需验证相邻元素连续(不要求从1开始),删除starts_at_one相关判断即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:51:08