如何使用PySpark将同组多行的不同列有效值合并到单行对应列
问题需求
将同一NV分组下的多行数据合并为单行,具体规则如下:
- 针对
value 1至value 4列,提取分组内对应列的有效非零double值填充到单行对应列 Q列可合并为字符串"1234",也可直接省略
输入示例
| NV | Q | value 1 | value 2 | value 3 | value 4 |
|---|---|---|---|---|---|
| 234 | 1 | 10 | 0 | 0 | 0 |
| 234 | 2 | 0 | 15 | 0 | 0 |
| 234 | 3 | 0 | 0 | 20 | 0 |
| 234 | 4 | 0 | 0 | 0 | 25 |
输出示例
| NV | Q | value 1 | value 2 | value 3 | value 4 |
|---|---|---|---|---|---|
| 234 | 1234 | 10 | 15 | 20 | 25 |
实现方案
方案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
相关产品推荐
相关产品推荐

