Python For循环统计报错:列值不全导致取值异常
处理列缺失取值的统一统计计算
数据集
q1 q2 q3 q4 0 a a a a 1 b a a a 2 c c b a 3 d d b a 4 a a a a 5 b c b a 6 b a b a 7 c c b a 8 d d b a
各列取值范围
- q1: 'a','b','c','d'
- q2: 'a','c','d'
- q3: 'a','b'
- q4: 'a'
问题
尝试用for循环对所有列执行统一统计,但部分列不包含全部目标取值,运行以下代码时触发KeyError:
col = ['q1', 'q2', 'q3', 'q4'] for i in col: print((df[i].value_counts()['a']) + (df[i].value_counts()['b']) + (df[i].value_counts()['c']) + (df[i].value_counts()['d']))
解决方案
报错根源是当列中不存在某个取值时,value_counts()返回的Series中没有对应的索引,直接通过索引访问会报错。可以用.get()方法,当索引不存在时返回0,完美适配所有列的统计需求:
写法一:分步累加
col = ['q1', 'q2', 'q3', 'q4'] target_values = ['a', 'b', 'c', 'd'] for col_name in col: count_sum = 0 val_counts = df[col_name].value_counts() for v in target_values: count_sum += val_counts.get(v, 0) print(count_sum)
写法二:简洁生成器
col = ['q1', 'q2', 'q3', 'q4'] target_values = ['a', 'b', 'c', 'd'] for col_name in col: val_counts = df[col_name].value_counts() print(sum(val_counts.get(v, 0) for v in target_values))
额外说明
如果你只是要统计这四个取值的总出现次数,其实每列的总次数就是数据集的行数(这里是9),因为所有行的列都有取值。但上面的方法更通用,后续如果需要调整目标取值范围,直接修改target_values即可。
内容的提问来源于stack exchange,提问作者Ashok Behara
相关产品推荐
相关产品推荐

