使用Pandas解析CSV文件时的计数错误问题求助
问题修正与高效实现方案
错误原因分析
你用嵌套循环遍历Responsible和Status两个列表的写法,本质是把每个部门和所有状态做了笛卡尔积匹配,没有按行对应关系统计,导致计数重复或错乱,这是C++手动遍历思维在Python/Pandas环境下的典型误区。
错误代码的修正方案(循环写法,仅用于理解逻辑)
如果暂时想保留循环思维,必须按行遍历,而非嵌套两个独立列表:
import pandas as pd # 读取CSV并提取指定列 df = pd.read_csv('tasks.csv')[['Responsible', 'Status']] # 初始化计数字典 dept_stats = {} # 遍历每一行数据(按行匹配部门和状态) for _, row in df.iterrows(): dept = row['Responsible'] status = row['Status'] # 首次遇到部门时初始化计数 if dept not in dept_stats: dept_stats[dept] = {'Comp': 0, 'Active': 0, 'Total': 0} # 累加总任务数 dept_stats[dept]['Total'] += 1 # 对应状态计数 if status == 'Comp': dept_stats[dept]['Comp'] += 1 elif status == 'Active': dept_stats[dept]['Active'] += 1 # 打印结果 for dept, stats in dept_stats.items(): print(f"部门: {dept}") print(f"Comp任务数: {stats['Comp']}") print(f"Active任务数: {stats['Active']}") print(f"总任务数: {stats['Total']}\n")
Pandas原生高效实现(推荐)
Pandas是为向量式数据处理设计的,完全不需要手动循环,底层用C实现,效率比Python循环高几个数量级,代码也更简洁:
方法1:groupby + 自定义聚合(灵活适配多需求)
import pandas as pd # 读取指定列 df = pd.read_csv('tasks.csv')[['Responsible', 'Status']] # 按部门分组,一次性统计所有指标 result = df.groupby('Responsible').agg( 总任务数=('Status', 'count'), Comp任务数=('Status', lambda x: (x == 'Comp').sum()), Active任务数=('Status', lambda x: (x == 'Active').sum()) ).reset_index().rename(columns={'Responsible': '部门'}) # 输出结果 print(result) # 保存到新CSV(可选) # result.to_csv('部门任务统计.csv', index=False)
方法2:crosstab快速生成状态分布表
如果只需要统计指定状态的数量,用交叉表更直观:
import pandas as pd df = pd.read_csv('tasks.csv')[['Responsible', 'Status']] # 生成部门×状态的交叉计数表 cross_table = pd.crosstab(df['Responsible'], df['Status']) # 添加总任务数列 cross_table['总任务数'] = cross_table.sum(axis=1) # 筛选需要的列并格式化 result = cross_table[['Comp', 'Active', '总任务数']].reset_index().rename(columns={'Responsible': '部门'}) print(result)
内容的提问来源于stack exchange,提问作者Darsh Dinger
相关产品推荐
相关产品推荐

