如何拆分数据集单行并在生成的新行中保留公司名称字段?
宽表转长表拆分多部门预算数据实现方案
核心处理逻辑:将每行存储的多部门预算字段按部门维度拆分为独立行,自动过滤预算值为空的部门记录,拆分全程保留企业名称字段,最终输出统一结构的结果表。
方案1:Python Pandas 实现(适合批量处理csv/Excel数据)
直接运行以下代码,替换对应文件路径即可得到结果:
import pandas as pd # 读取原始数据,支持csv、excel格式,读取excel替换为pd.read_excel即可 raw_df = pd.read_csv("你的原始预算数据路径.csv") # 配置部门与对应字段的映射,后续新增部门直接在字典里加键值对即可 dept_field_map = { "Marketing": ("marketing_budget", "marketing_remaining"), "Finance": ("finance_budget", "finance_remaining"), "Sales": ("sales_budget", "sales_remaining") } split_result = [] for dept_name, (budget_col, remain_col) in dept_field_map.items(): # 提取当前部门数据,过滤预算为空的记录 dept_data = raw_df[["company", budget_col, remain_col]].dropna(subset=[budget_col]) # 统一列名 dept_data.columns = ["Company", "Budget", "Amount Remaining"] # 新增部门列 dept_data["Department"] = dept_name split_result.append(dept_data) # 合并所有部门数据,调整列顺序匹配输出要求 final_df = pd.concat(split_result)[["Company", "Department", "Budget", "Amount Remaining"]] # 导出结果 final_df.to_csv("拆分完成的预算数据.csv", index=False)
注:如果原始数据中空值不是标准null,是-、无这类自定义标记,在读取数据后加一行raw_df = raw_df.replace(["-", "无"], pd.NA)即可正常识别空值。
方案2:Excel Power Query 实现(无代码操作,适合日常办公场景)
操作步骤:
- 选中原始数据区域,点击顶部「数据」选项卡 → 选择「从表格/区域」,将数据导入Power Query编辑器
- 选中
company列,点击顶部「转换」选项卡 → 选择「逆透视列」→「逆透视其他列」,此时所有部门预算字段会被拆成属性、值两列 - 选中「属性」列,点击「拆分列」→ 按分隔符
_拆分,拆为2段,第一段为部门名称,第二段为指标类型(budget/remaining) - 选中指标类型列,点击「透视列」,值列选择「值」列,聚合方式选择「不要聚合」,此时会自动生成Budget、Remaining两列
- 过滤Budget列中的null值,将列名重命名为要求的
Company/Department/Budget/Amount Remaining,点击「关闭并上载」即可得到结果
方案3:SQL 实现(适合数据存储在数据库中的场景)
以MySQL语法为例,通过UNION ALL拼接各部门的非空数据即可:
SELECT company AS Company, 'Marketing' AS Department, marketing_budget AS Budget, marketing_remaining AS `Amount Remaining` FROM enterprise_budget WHERE marketing_budget IS NOT NULL UNION ALL SELECT company AS Company, 'Finance' AS Department, finance_budget AS Budget, finance_remaining AS `Amount Remaining` FROM enterprise_budget WHERE finance_budget IS NOT NULL UNION ALL SELECT company AS Company, 'Sales' AS Department, sales_budget AS Budget, sales_remaining AS `Amount Remaining` FROM enterprise_budget WHERE sales_budget IS NOT NULL ORDER BY Company, Department;
注:你给出的期望输出示例里有两处笔误:Finace应为正确拼写Finance,Sales行Budget值200,00应为200,000,实际处理时注意校验数值和拼写即可。
内容的提问来源于stack exchange,提问作者Anabel Rod
相关产品推荐
相关产品推荐

