Power Query分组后展开:如何计算工厂最早安装年份?
问题描述
现有数据集示例(零件按使用工厂编号和投产年份分组,零件唯一):
| Part | Factory | Part Install Year |
|---|---|---|
| 1 | 100 | 2018 |
| 2 | 100 | 2018 |
| 3 | 100 | 2018 |
| 3 | 200 | 2019 |
| 3 | 300 | 2020 |
| 4 | 400 | 2019 |
| 5 | 400 | 2020 |
| 6 | 500 | 2018 |
期望输出:将所有关联零件按其安装过的编号最小的工厂进行分组(Part Grouping),并计算该工厂内所有零件的最早投产年份(Factory Install Year):
| Part | Factory | Part Install Year | Part Grouping | Factory Install Year |
|---|---|---|---|---|
| 1 | 100 | 2018 | 100 | 2018 |
| 2 | 100 | 2018 | 100 | 2018 |
| 3 | 100 | 2018 | 100 | 2018 |
| 3 | 200 | 2019 | 100 | 2018 |
| 3 | 300 | 2020 | 100 | 2018 |
| 4 | 400 | 2019 | 400 | 2019 |
| 5 | 400 | 2020 | 400 | 2019 |
| 6 | 500 | 2018 | 500 | 2018 |
目前无法实现Factory Install Year的创建,需解决方法。
解决方案
方法1:SQL实现
核心逻辑是先按零件分组获取每个零件对应的最小工厂编号,再按工厂分组获取该工厂的最早投产年份,最后将两个计算结果关联回原表:
WITH part_min_factory AS ( -- 获取每个零件对应的最小工厂编号 SELECT Part, MIN(Factory) AS Part_Grouping FROM your_table GROUP BY Part ), factory_min_year AS ( -- 获取每个工厂的最早投产年份 SELECT Factory, MIN(Part_Install_Year) AS Factory_Install_Year FROM your_table GROUP BY Factory ) -- 关联原表与中间计算结果 SELECT t.Part, t.Factory, t.Part_Install_Year, pmf.Part_Grouping, fmy.Factory_Install_Year FROM your_table t JOIN part_min_factory pmf ON t.Part = pmf.Part JOIN factory_min_year fmy ON pmf.Part_Grouping = fmy.Factory;
方法2:Python Pandas实现
通过分组计算得到中间结果,再合并回原数据集:
import pandas as pd # 加载原数据(实际使用时可替换为读取文件逻辑) df = pd.DataFrame({ 'Part': [1,2,3,3,3,4,5,6], 'Factory': [100,100,100,200,300,400,400,500], 'Part Install Year': [2018,2018,2018,2019,2020,2019,2020,2018] }) # 1. 计算每个零件对应的最小工厂编号 part_grouping = df.groupby('Part')['Factory'].min().reset_index(name='Part Grouping') # 2. 计算每个工厂的最早投产年份 factory_min_year = df.groupby('Factory')['Part Install Year'].min().reset_index(name='Factory Install Year') # 3. 合并结果到原表 result = df.merge(part_grouping, on='Part') result = result.merge(factory_min_year, left_on='Part Grouping', right_on='Factory').drop(columns='Factory_y') result = result.rename(columns={'Factory_x': 'Factory'}) print(result)
执行后即可得到符合期望的输出结果。
内容的提问来源于stack exchange,提问作者SmooveG
相关产品推荐
相关产品推荐

