如何将行转列并以指定分隔符拼接多行字符串为单个字符串
行转列并拼接多列数据为单字符串的实现方案
需求说明
将数据表按name分组,把type字段的值转为列名,同时将每组内对应type的num、age、dateA(截取日期部分)、DateB(截取日期部分)、PRICE字段用逗号拼接成单个字符串。
原数据表
| type | name | num | age | dateA | DateB | PRICE |
|---|---|---|---|---|---|---|
| A | Aziz | 1 | 12 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 129.00 |
| B | Aziz | 1 | 34 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 100.00 |
| C | Aziz | 0 | 20 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 349.00 |
| D | Aziz | 1 | 90 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 222.00 |
期望结果
| name | A | B | C | D |
|---|---|---|---|---|
| Aziz | 1, 12,2012-01-11,2012-01-11,129.00 | 1, 34, 2012-01-11, 2012-01-11, 100.00 | 0,20,2012-01-11, 2012-01-11, 349.00 | 1,90,2012-01-11, 2012-01-11,222.00 |
实现方案
1. SQL(以SQL Server为例)
先通过字符串拼接函数合并目标字段,再用PIVOT完成行转列:
SELECT name, A, B, C, D FROM ( SELECT name, type, CONCAT( num, ', ', age, ', ', CONVERT(VARCHAR(10), dateA, 23), ', ', CONVERT(VARCHAR(10), DateB, 23), ', ', PRICE ) AS combined_value FROM your_table_name ) AS src PIVOT ( MAX(combined_value) FOR type IN (A, B, C, D) ) AS pvt;
CONVERT(VARCHAR(10), dateA, 23)用于把日期时间格式转为YYYY-MM-DD字符串CONCAT负责拼接字段,可按需调整分隔符PIVOT中用MAX聚合,因为每组每个type仅对应一条数据,聚合结果不受影响
2. Python(使用Pandas库)
通过groupby+agg拼接字段,再用unstack实现行转列:
import pandas as pd # 构造原数据DataFrame(实际场景可通过read_csv/read_sql读取) df = pd.DataFrame({ 'type': ['A', 'B', 'C', 'D'], 'name': ['Aziz', 'Aziz', 'Aziz', 'Aziz'], 'num': [1, 1, 0, 1], 'age': [12, 34, 20, 90], 'dateA': ['2012-01-11 00:00:00.000']*4, 'DateB': ['2012-01-11 00:00:00.000']*4, 'PRICE': ['129.00', '100.00', '349.00', '222.00'] }) # 截取日期部分 df['dateA'] = df['dateA'].str.split(' ').str[0] df['DateB'] = df['DateB'].str.split(' ').str[0] # 拼接字段 df['combined'] = df.apply( lambda row: f"{row['num']}, {row['age']}, {row['dateA']}, {row['DateB']}, {row['PRICE']}", axis=1 ) # 行转列 result = df.groupby(['name', 'type'])['combined'].first().unstack() print(result)
- 用
str.split截取日期部分,也可通过pd.to_datetime格式化日期 apply自定义拼接逻辑,可灵活调整分隔符和字段顺序groupby+unstack实现行转列,first用于获取唯一值
内容的提问来源于stack exchange,提问作者Aziz bouchtaoui
相关产品推荐
相关产品推荐

