CSV数据整理代码求助:目标求和结果与实际输出不符
排查CSV列求和全为27的问题
看起来你遇到了一个典型的统计逻辑偏差——所有列的求和结果都固定为27,这说明你的代码大概率没有针对每列的实际数据做统计,而是重复计算了同一个固定值(比如CSV的数据行数)。我来帮你拆解最可能的问题点,以及对应的修复方案:
最常见的错误原因
1. 误将行数当作列统计值
你的输出里所有列都是27,这很可能是代码把CSV的数据行数当成了每列的求和结果。比如你可能先遍历所有行统计行数,然后把这个数值直接赋值给所有列,类似这样的错误代码:
import csv with open('your_file.csv', 'r') as f: reader = csv.DictReader(f) row_count = 0 column_sums = {} # 先统计总行数 for row in reader: row_count += 1 # 错误:把行数赋值给所有列 for col in reader.fieldnames: column_sums[col] = row_count
这种情况下,所有列的结果自然都是同一个行数(27)。
2. 计数器未在列间重置
如果你的代码初始化了一个全局计数器,遍历所有列时却没有重置它,就会导致统计逻辑混乱。不过你的情况是所有列值相同,这个可能性稍低,但也要检查类似这样的错误:
# 错误示例:全局计数器未重置 total = 0 column_sums = {} for col in target_columns: for row in reader: total += 1 # 每次列遍历都在之前的total上累加 column_sums[col] = total
修复方案(两种常见实现方式)
方式一:原生CSV模块
假设你的CSV中,Company和Booth列只要非空就算数(对应你期望的28),其他列是用1/Yes标记符合条件的项,可以用下面的代码:
import csv # 定义需要统计的目标列 target_columns = [ "Company", "Booth", "Full-Time", "Full-Time Visa Sponsor", "Part-Time", "Internship", "Freshman", "Sophomore", "Junior", "Senior", "Post-Bacs", "MS", "PhD", "Alumni" ] # 初始化每个列的计数器为0 column_counts = {col: 0 for col in target_columns} with open('your_data.csv', 'r', newline='', encoding='utf-8') as csvfile: reader = csv.DictReader(csvfile) for row in reader: for col in target_columns: cell_val = row.get(col, "").strip() # 根据列类型设置统计规则 if col in ["Company", "Booth"]: # 非空即计数 if cell_val: column_counts[col] += 1 else: # 标记为1/Yes/Y则计数 if cell_val in ("1", "Yes", "Y"): column_counts[col] += 1 # 输出结果 print("Column Sum") for col, count in column_counts.items(): print(f"{col} {count}")
方式二:Pandas(更简洁)
如果你用Pandas处理数据,正确的统计逻辑应该是针对每列的有效值计数,而不是直接取行数:
import pandas as pd df = pd.read_csv('your_data.csv') column_counts = {} for col in df.columns: if col in ["Company", "Booth"]: # 统计非空值数量 column_counts[col] = df[col].notna().sum() else: # 统计值为1或Yes的数量(忽略大小写和空格) mask = (df[col] == 1) | (df[col].str.strip().str.lower() == "yes") column_counts[col] = mask.sum() # 输出结果 print("Column Sum") for col, count in column_counts.items(): print(f"{col} {count}")
快速排查步骤
- 检查统计逻辑:确认你不是在统计行数,而是针对每个单元格的实际值做判断/累加
- 重置计数器:确保每列统计前,计数器都被重置为0
- 验证CSV格式:确认表头行正确,数据行没有混入异常值
- 打印中间值:在循环中加入
print(row[col]),查看每个单元格的实际值是否符合预期
内容的提问来源于stack exchange,提问作者PKPython
相关产品推荐
相关产品推荐

