按项目名称合并行并自动求和C列数值的技术需求
解决方案:自动化处理Tableau导出Excel的合并单元格与金额求和
注意:确保代码开头已导入必要模块:
import pandas as pd import numpy as np import os
核心实现逻辑
- 跳过手动转CSV步骤,直接读取Excel文件,自动识别合并单元格产生的空值
- 用向前填充补全合并单元格的项目名称、参考编号
- 清洗金额列的特殊字符(千位分隔符、货币符号等),转换为可计算的数值类型
- 按项目名称和参考编号分组,对金额列求和并保留原始项目信息
修改后的完整代码
elif typeOfFile == "9": # 直接读取Excel文件,指定保留A、B、C三列,第一行为表头 df = pd.read_excel(filename, usecols=['A', 'B', 'C'], header=0) # 填充合并单元格的空值:将上一行的项目名称、参考编号补全到当前空行 df[['A', 'B']] = df[['A', 'B']].ffill() # 清洗C列金额:移除所有非数字、非小数点的字符,转换为数值类型 # 若千位分隔符是逗号(如1,234.56),可先加df['C'] = df['C'].str.replace(',', '') df['C'] = df['C'].str.replace(r'[^\d.]', '', regex=True) df['C'] = pd.to_numeric(df['C'], errors='coerce') # 按A(项目名称)、B(参考编号)分组,对C列求和,保留原始A、B值 aggregated_df = df.groupby(['A', 'B'], as_index=False)['C'].sum() # 添加需求中的额外列 aggregated_df['DPAC'] = 'code' aggregated_df['Item'] = np.nan aggregated_df['Segment'] = '' aggregated_df['EndCustomerCountry'] = '' aggregated_df['SubSegment'] = '' aggregated_df['TechnologyName'] = '' # 按要求调整列顺序 new_cols = ['DPAC', 'Item', 'A', 'B', 'Segment', 'EndCustomerCountry', 'C', 'SubSegment', 'TechnologyName'] aggregated_df = aggregated_df.reindex(columns=new_cols) # 导出到目标CSV,自动判断是否需要写入表头 output_path = 'C:/Program Files/Data_Arranger/Output Files/Monthly.csv' file_exists = os.path.isfile(output_path) aggregated_df.to_csv(output_path, mode='a', header=not file_exists, index=False)
关键细节说明
- 合并单元格处理:
ffill()方法会自动将合并单元格首行的非空值填充到后续空行,完美适配Tableau导出的合并单元格格式 - 金额清洗灵活性:正则
[^\d.]可移除所有货币符号、空格、特殊千位分隔符,若你的数据有特殊格式(如用点做千位分隔符),可调整正则规则 - 分组求和准确性:
groupby(['A','B'], as_index=False)确保分组后项目名称和参考编号作为普通列保留,不会被转为索引,直接得到每个项目的一行汇总数据 - 导出逻辑优化:用
os.path.isfile判断文件是否存在,避免重复写入表头
内容的提问来源于stack exchange,提问作者Gatarlo
相关产品推荐
相关产品推荐

