SQL聚合行输入数据并将AssetClass行值转为列的技术求助
解决方案
方法1:Python Pandas实现
假设原数据结构示例:
| PortID | AssetClass |
|---|---|
| 1 | 股票 |
| 1 | 债券 |
| 2 | 商品 |
| 2 | 股票 |
| 2 | 现金 |
目标结构(以计数为例):
| PortID | 股票 | 债券 | 商品 | 现金 | 另类 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 0 | 0 | 0 |
| 2 | 1 | 0 | 1 | 1 | 0 |
可以用透视表快速实现:
import pandas as pd # 读取原始数据 df = pd.read_csv('your_data.csv') # 生成交叉表,按PortID分组,AssetClass转列并计数 pivoted_df = pd.crosstab(df['PortID'], df['AssetClass']) # 补全要求的5个AssetClass列(避免缺失列) required_classes = ['股票', '债券', '商品', '现金', '另类'] for cls in required_classes: if cls not in pivoted_df.columns: pivoted_df[cls] = 0 # 重置索引,让PortID回到常规列 pivoted_df = pivoted_df.reset_index() # 输出结果 print(pivoted_df)
如果只需标记是否存在(而非计数),可以改用pivot配合填充:
df['flag'] = 1 pivoted_df = df.pivot(index='PortID', columns='AssetClass', values='flag').fillna(0).astype(int) # 同样补全缺失列后重置索引
方法2:SQL实现(以MySQL为例)
如果数据存储在数据库中,用条件聚合直接转换:
SELECT PortID, COUNT(CASE WHEN AssetClass = '股票' THEN 1 END) AS 股票, COUNT(CASE WHEN AssetClass = '债券' THEN 1 END) AS 债券, COUNT(CASE WHEN AssetClass = '商品' THEN 1 END) AS 商品, COUNT(CASE WHEN AssetClass = '现金' THEN 1 END) AS 现金, COUNT(CASE WHEN AssetClass = '另类' THEN 1 END) AS 另类 FROM your_table GROUP BY PortID;
若需标记存在性,将COUNT替换为MAX(CASE WHEN AssetClass = 'XXX' THEN 1 ELSE 0 END)即可。
内容的提问来源于stack exchange,提问作者Petter Løkken
相关产品推荐
相关产品推荐

