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

Spark高效行查询(透视功能):实现动态透视并筛选数据的方法

动态透视长格式DataFrame并筛选数据

问题背景

现有如下长格式DataFrame:

|sno    |id             |value       |
--------|---------------|------------|
1       |Cnt_id         |1966        |
1       |Active_Ind     |FALSE       |
1       |Report_Status  |Active      |
1       |New_Ind        |FALSE       |
1       |State          |OA          |
2       |Cnt_id         |1223        |
2       |Active_Ind     |FALSE       |
2       |Report_Status  |Inactive    |
2       |New_Ind        |FALSE       |
2       |State          |MS          |
3       |Cnt_id         |112         |
3       |Active_Ind     |TRUE        |
3       |Report_Status  |Inactive    |
3       |New_Ind        |TRUE        |
3       |State          |US          |

需要实现类似SQL语句 select * from table where Active_Ind='FALSE' 的查询,得到宽格式结果:

---------------------------------------------------------------|
sno |Cnt_id |Active_Ind     |Report_Status  |New_Ind    |State |
---------------------------------------------------------------|
1   |1966   |FALSE          |Active         |FALSE      |OA    |
2   |1223   |FALSE          |Inactive       |FALSE      |MS    |

常规透视需要硬编码列名,现寻求动态实现方式,可按需指定列进行动态透视与筛选。

动态实现方案(Python Pandas)

步骤1:长格式转宽格式

无需硬编码列名,直接用pivot方法自动识别所有字段生成宽表:

import pandas as pd

# 构造示例长格式数据
data = [
    [1, 'Cnt_id', '1966'],
    [1, 'Active_Ind', 'FALSE'],
    [1, 'Report_Status', 'Active'],
    [1, 'New_Ind', 'FALSE'],
    [1, 'State', 'OA'],
    [2, 'Cnt_id', '1223'],
    [2, 'Active_Ind', 'FALSE'],
    [2, 'Report_Status', 'Inactive'],
    [2, 'New_Ind', 'FALSE'],
    [2, 'State', 'MS'],
    [3, 'Cnt_id', '112'],
    [3, 'Active_Ind', 'TRUE'],
    [3, 'Report_Status', 'Inactive'],
    [3, 'New_Ind', 'TRUE'],
    [3, 'State', 'US'],
]
df_long = pd.DataFrame(data, columns=['sno', 'id', 'value'])

# 动态透视:以sno为分组键,id的唯一值自动作为列
df_wide = df_long.pivot(index='sno', columns='id', values='value').reset_index()
# 清理列名的多级索引标识
df_wide.columns.name = None

步骤2:执行筛选操作

直接对宽表进行条件筛选,逻辑与SQL一致:

# 筛选Active_Ind为'FALSE'的行
result = df_wide[df_wide['Active_Ind'] == 'FALSE']
# 可选:调整列顺序匹配目标输出
result = result[['sno', 'Cnt_id', 'Active_Ind', 'Report_Status', 'New_Ind', 'State']]
print(result)

输出结果

sno Cnt_id Active_Ind Report_Status New_Ind State
0    1   1966      FALSE        Active   FALSE    OA
1    2   1223      FALSE      Inactive   FALSE    MS

动态性说明

  • 无需提前指定所有列名,pivot会自动识别id列的所有唯一值作为宽表列
  • 若后续id列新增字段,代码无需修改即可自动适配
  • 筛选条件可灵活调整,比如改为Active_Ind='TRUE'或其他字段的条件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:18:29