如何在Power Query中按另一列分组执行fill up/fill down操作?
按分组列执行向上/向下填充的解决方案
原始数据
| 客户编号 | 期末余额 |
|---|---|
| C001 | NULL |
| C001 | 100 |
| C001 | NULL |
| C002 | NULL |
| C002 | NULL |
| C002 | 499 |
| C002 | NULL |
| C002 | 599 |
| C002 | NULL |
期望结果
| 客户编号 | 期末余额 |
|---|---|
| C001 | 100 |
| C001 | 100 |
| C001 | 100 |
| C002 | 499 |
| C002 | 499 |
| C002 | 499 |
| C002 | 499 |
| C002 | 599 |
| C002 | 599 |
错误结果(全局fill down)
| 客户编号 | 期末余额 |
|---|---|
| C001 | 100 |
| C001 | 100 |
| C001 | 100 |
| C002 | 100 (错误) |
| C002 | 100 (错误) |
| C002 | 499 |
| C002 | 499 |
| C002 | 599 |
| C002 | 599 |
可以按分组列执行向上/向下填充,核心是先按分组字段拆分数据,再对每个分组单独填充,避免跨组污染,以下是不同工具的实现方式:
1. SQL(MySQL示例)
通过窗口函数按客户分组,先做后向填充(向上填充)再做前向填充(向下填充):
SELECT 客户编号, COALESCE( -- 后向填充:取当前行及之后第一个非NULL值(处理向上填充需求) LAST_VALUE(期末余额 IGNORE NULLS) OVER ( PARTITION BY 客户编号 ORDER BY (SELECT 1) ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ), -- 前向填充:取当前行及之前最后一个非NULL值(处理向下填充需求) LAST_VALUE(期末余额 IGNORE NULLS) OVER ( PARTITION BY 客户编号 ORDER BY (SELECT 1) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) ) AS 期末余额 FROM 你的数据表名;
2. Python Pandas
利用groupby拆分分组,对每组先执行bfill()(向上填充)再执行ffill()(向下填充):
import pandas as pd # 构造示例数据 df = pd.DataFrame({ '客户编号': ['C001', 'C001', 'C001', 'C002', 'C002', 'C002', 'C002', 'C002', 'C002'], '期末余额': [None, 100, None, None, None, 499, None, 599, None] }) # 分组填充 df['期末余额'] = df.groupby('客户编号')['期末余额'].apply(lambda x: x.bfill().ffill()) print(df)
3. Excel
方法1:分组手动填充
- 确保数据已按
客户编号排序,选中客户编号列,点击「数据」→「分级显示」→「创建组」 - 对每个分组单独选中
期末余额列的空值,输入第一个非空值的单元格引用,按Ctrl+Enter批量填充
方法2:公式自动填充
在新列输入以下公式,下拉填充即可按分组完成双向填充:
=LOOKUP(2,1/($A$2:$A$10=A2)/($B$2:$B$10<>""),$B$2:$B$10)
内容的提问来源于stack exchange,提问作者Solo
相关产品推荐
相关产品推荐

