如何按分组条件上下填充列,可使用PowerQuery、pandas或SQL实现
同instance分组下string_values空值填充方案
以下分别提供pandas、PowerQuery、SQL三种实现方式:
pandas 实现
核心用groupby结合填充函数处理,示例代码如下:
import pandas as pd # 向下填充:取同组内当前行上方最近的非空值填充 df['string_values'] = df.groupby('instance')['string_values'].ffill() # 向上填充:取同组内当前行下方最近的非空值填充 df['string_values'] = df.groupby('instance')['string_values'].bfill() # 组合使用:先下后上填充,覆盖同组存在至少一个非空值的所有场景 df['string_values'] = df.groupby('instance')['string_values'].ffill().bfill()
如果需要先按指定列(比如行号、时间列)排序再填充,可调整为:
df['string_values'] = df.groupby('instance', group_keys=False).apply( lambda x: x.sort_values('排序字段名')['string_values'].ffill() )
PowerQuery 实现
操作步骤如下:
- 将数据导入PowerQuery编辑器
- 选中
instance列,点击「转换」选项卡下的「分组依据」 - 分组操作选择「所有行」,新列名可命名为
grouped_data - 新增自定义列,根据填充需求输入对应公式:
- 向下填充:
= Table.FillDown([grouped_data], {"string_values"}) - 向上填充:
= Table.FillUp([grouped_data], {"string_values"})
- 向下填充:
- 展开自定义列的表结构,删除多余的辅助列即可得到结果
SQL 实现
支持窗口函数的数据库(MySQL8.0+、PostgreSQL、SQL Server、Hive等)可直接用以下语句,假设表名为your_table,存在可用于排序的字段row_id:
-- 向下填充 SELECT instance, row_id, FIRST_VALUE(string_values) OVER( PARTITION BY instance ORDER BY row_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS string_values FROM your_table; -- 向上填充 SELECT instance, row_id, FIRST_VALUE(string_values) OVER( PARTITION BY instance ORDER BY row_id DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS string_values FROM your_table;
内容的提问来源于stack exchange,提问作者SRP
相关产品推荐
相关产品推荐

