如何在Pandas DataFrame中按unique_id校验列值一致性并提取异常索引
解决方案:按组校验列值一致性并提取不一致行索引
没问题,我来帮你实现这个需求。咱们可以借助Pandas的分组(groupby)功能结合简单的逻辑判断,轻松定位到组内列值不一致的行索引。
步骤1:构建示例DataFrame
首先先把你提供的数据转换成Pandas DataFrame:
import numpy as np import pandas as pd # 构建你给出的示例数据 data = { 'unique_id': [30, 30, 30, 40, 40, 40], 'length': [12, 12, 12, 600, 800, 600], 'frame': [800, 800, 700, 1200, 1200, 800] } df = pd.DataFrame(data)
步骤2:实现校验逻辑
核心思路是:对每个unique_id分组,检查组内length和frame列的值是否全部一致,如果存在不同值,就把对应的行索引提取出来。
这里用transform方法非常方便,它能把分组后的判断结果映射回原DataFrame的每一行,这样我们可以直接筛选出目标行:
# 初始化存储结果的列表 length_mismatch = [] frame_mismatch = [] # 处理length列:找出组内值不一致的行索引 length_not_unique = df.groupby('unique_id')['length'].transform(lambda x: x.nunique() > 1) length_mismatch = df[length_not_unique].index.tolist() # 处理frame列:找出组内值不一致的行索引 frame_not_unique = df.groupby('unique_id')['frame'].transform(lambda x: x.nunique() > 1) frame_mismatch = df[frame_not_unique].index.tolist() # 输出预期结果 print(f"length={length_mismatch}") # 输出: length=[4] print(f"frame={frame_mismatch}") # 输出: frame=[2,5]
逻辑解释
groupby('unique_id')['length']:按unique_id分组,聚焦到length列transform(lambda x: x.nunique() > 1):对每个分组,判断该组内length值的唯一数量是否大于1(即存在不同值),返回和原DataFrame长度一致的布尔序列df[length_not_unique].index.tolist():筛选出布尔序列为True的行,提取它们的索引并转成列表
运行这段代码后,就能得到你需要的length=[4]和frame=[2,5]的结果啦。
内容的提问来源于stack exchange,提问作者pushpa
相关产品推荐
相关产品推荐

