检查DataFrame各列元素类型是否一致时触发KeyError问题求助
检查DataFrame各列元素类型是否一致时触发KeyError问题求助
嘿,我来帮你拆解下这个问题~
你碰到的KeyError: 155,核心原因是混淆了pandas的标签索引和位置索引:
你用range(0, len(df))生成的是「位置序号」,但df[column][i]是在按标签索引取值——也就是说pandas会去查找该列索引中等于i的标签,而不是直接取第i个位置的元素。如果你的DataFrame索引不是连续的整数(比如之前删过行、或者索引是字符串/非连续整数类型),当循环到i=155时,你的索引里没有这个标签,自然就抛出KeyError了。
至于你单独测试时没问题,大概率是因为你选的i刚好是索引中存在的标签,没碰到缺失的情况而已。
解决方法
方法1:改用位置索引取值
把df[column][i]改成df[column].iloc[i],iloc是专门按位置索引的方法,不管你的DataFrame索引是什么类型,都能准确取到第i个位置的元素:
a = 0 first_object = df.iloc[0] # 这里也建议改成iloc[0],确保取第一行的位置,而非标签为0的行 for column in df: for i in range(len(df)): if type(df[column].iloc[i]) != type(first_object[column]): a += 1 print(a)
方法2:用pandas原生方法简化代码(更高效)
其实完全不用写嵌套循环,pandas的apply方法可以帮你更简洁、高效地完成检查:
# 检查每列所有元素类型是否和第一行元素类型一致 type_consistent = df.apply(lambda col: all(type(x) == type(col.iloc[0]) for x in col)) # 输出类型不一致的列 print("类型不一致的列:", type_consistent[type_consistent == False].index.tolist()) # 统计类型不一致的元素总数 total_inconsistent = sum(df.apply(lambda col: sum(type(x) != type(col.iloc[0]) for x in col))) print("类型不一致的元素总数:", total_inconsistent)
这种方式不仅避免了索引问题,还利用了pandas的向量化操作,比嵌套循环快得多,尤其是当DataFrame规模较大时。
备注:内容来源于stack exchange,提问作者data_student
相关产品推荐
相关产品推荐

