You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

快速排查步骤

  1. 检查统计逻辑:确认你不是在统计行数,而是针对每个单元格的实际值做判断/累加
  2. 重置计数器:确保每列统计前,计数器都被重置为0
  3. 验证CSV格式:确认表头行正确,数据行没有混入异常值
  4. 打印中间值:在循环中加入print(row[col]),查看每个单元格的实际值是否符合预期

内容的提问来源于stack exchange,提问作者PKPython

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:54:07