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

按项目名称合并行并自动求和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)

关键细节说明

  1. 合并单元格处理:ffill()方法会自动将合并单元格首行的非空值填充到后续空行,完美适配Tableau导出的合并单元格格式
  2. 金额清洗灵活性:正则[^\d.]可移除所有货币符号、空格、特殊千位分隔符,若你的数据有特殊格式(如用点做千位分隔符),可调整正则规则
  3. 分组求和准确性:groupby(['A','B'], as_index=False)确保分组后项目名称和参考编号作为普通列保留,不会被转为索引,直接得到每个项目的一行汇总数据
  4. 导出逻辑优化:用os.path.isfile判断文件是否存在,避免重复写入表头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:25:30