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

如何使用PySpark将同组多行的不同列有效值合并到单行对应列

问题需求

将同一NV分组下的多行数据合并为单行,具体规则如下:

  • 针对value 1至value 4列,提取分组内对应列的有效非零double值填充到单行对应列
  • Q列可合并为字符串"1234",也可直接省略

输入示例

NVQvalue 1value 2value 3value 4
234110000
234201500
234300200
234400025

输出示例

NVQvalue 1value 2value 3value 4
234123410152025

实现方案

方案1:SQL实现

假设使用支持聚合函数的SQL方言(如MySQL、PostgreSQL),可通过分组聚合提取非零值,同时拼接Q列:

SELECT
    NV,
    GROUP_CONCAT(Q ORDER BY Q SEPARATOR '') AS Q,
    MAX(CASE WHEN `value 1` != 0 THEN `value 1` ELSE NULL END) AS `value 1`,
    MAX(CASE WHEN `value 2` != 0 THEN `value 2` ELSE NULL END) AS `value 2`,
    MAX(CASE WHEN `value 3` != 0 THEN `value 3` ELSE NULL END) AS `value 3`,
    MAX(CASE WHEN `value 4` != 0 THEN `value 4` ELSE NULL END) AS `value 4`
FROM your_table
GROUP BY NV;
  • 若不需要Q列,直接删除GROUP_CONCAT(...) AS Q行即可
  • 由于每个分组内每个value列仅存在一个非零值,MAX()函数可精准提取该值(NULL不参与聚合计算)

方案2:Python Pandas实现

用Python处理数据时,Pandas可快速完成分组合并:

import pandas as pd

# 加载输入数据
df = pd.DataFrame({
    'NV': [234, 234, 234, 234],
    'Q': [1, 2, 3, 4],
    'value 1': [10, 0, 0, 0],
    'value 2': [0, 15, 0, 0],
    'value 3': [0, 0, 20, 0],
    'value 4': [0, 0, 0, 25]
})

# 分组聚合处理
result = df.groupby('NV').agg(
    Q=('Q', lambda x: ''.join(map(str, x))),
    value_1=('value 1', lambda x: x[x != 0].iloc[0]),
    value_2=('value 2', lambda x: x[x != 0].iloc[0]),
    value_3=('value 3', lambda x: x[x != 0].iloc[0]),
    value_4=('value 4', lambda x: x[x != 0].iloc[0])
).reset_index()

# 重命名列名匹配示例格式
result = result.rename(columns={
    'value_1': 'value 1',
    'value_2': 'value 2',
    'value_3': 'value 3',
    'value_4': 'value 4'
})

print(result)

运行后输出将匹配示例结果,若不需要Q列,删除Q=('Q', ...)行即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:50:57