按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
相关产品推荐
相关产品推荐

