Pandas dataframe校验相同col1对应col2是否一致并定位异常行
Pandas 同col1值对应col2值一致性校验方案
以下代码基于你提供的示例数据实现两种校验需求:
1. 定位存在col2取值不一致的异常col1值
按col1分组统计每组col2的唯一值数量,筛选出数量大于1的col1即可:
import pandas as pd # 构造示例数据,实际使用时替换为你的DataFrame df = pd.DataFrame({ 'col1': ['X', 'Y', 'Y', 'X', 'Z', 'X'], 'col2': ['A', 'B', 'B', 'A', 'C', 'B'] }, index=[1,2,3,4,5,6]) # 计算每个col1对应的col2唯一值数量 col1_col2_nunique = df.groupby('col1')['col2'].nunique() # 筛选出唯一值数量>1的异常col1 bad_col1_list = col1_col2_nunique[col1_col2_nunique > 1].index.tolist() print("异常col1取值:", bad_col1_list) # 输出结果:异常col1取值: ['X']
2. 直接获取所有异常行的索引
如果需要拿到所有对应col1存在col2不一致的行索引,有两种实现方式:
- 小数据量场景直接用transform生成辅助列筛选
# 生成每个col1对应的col2唯一值数量辅助列 df['col2_nunique'] = df.groupby('col1')['col2'].transform('nunique') # 筛选异常行索引 bad_row_indexes = df[df['col2_nunique'] > 1].index.tolist() # 删除辅助列 df.drop('col2_nunique', axis=1, inplace=True) print("异常行索引:", bad_row_indexes) # 输出结果:异常行索引: [1, 4, 6]
- 大数据量场景优先用已筛选出的异常col1过滤,避免transform带来的性能损耗
# 基于第一种方法得到的bad_col1_list直接筛行 bad_row_indexes = df[df['col1'].isin(bad_col1_list)].index.tolist()
内容的提问来源于stack exchange,提问作者user67275
相关产品推荐
相关产品推荐

