多行列转行并将type与表头拼接为单行的实现需求
需求说明
需要将多行数据转换为宽表格式,将type字段与原有表头拼接形成新表头(如num x A),最终将同一name的多条数据合并为单行,同时去除日期字段的时分秒部分。
原始数据
| 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 | num x A | age x A | dateA x A | DateB x A | PRICE x A | num x B | age x B | dateA x B | DateB x B | PRICE x B | num x C | age x C | dateA x C | DateB x C | PRICE x C | num x D | age x D | dateA x D | DateB x D | PRICE x 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 |
实现方法
方法一:使用Excel Power Query
- 将数据导入Excel,选中数据区域,点击「数据」选项卡 → 「从表格/区域」,进入Power Query编辑器。
- 处理日期字段:选中
dateA和DateB列,点击「转换」选项卡 → 「日期」→ 「提取」→ 「日期仅」,去除时分秒部分。 - 转置为宽表:选中
name列,点击「转换」选项卡 → 「透视列」,弹出窗口中:- 值列选择
num、age、dateA、DateB、PRICE - 高级选项选择「不要聚合」
- 生成的表头为
字段名.type格式,选中所有透视后的列,右键「重命名」,批量替换.为x。
- 值列选择
- 点击「关闭并上载」,得到目标格式数据。
方法二:使用Python pandas
import pandas as pd # 加载原始数据(实际场景可从Excel/CSV文件读取) data = [ {"type": "A", "name": "Aziz", "num": 1, "age": 12, "dateA": "2012-01-11 00:00:00.000", "DateB": "2012-01-11 00:00:00.000", "PRICE": 129.00}, {"type": "B", "name": "Aziz", "num": 1, "age": 34, "dateA": "2012-01-11 00:00:00.000", "DateB": "2012-01-11 00:00:00.000", "PRICE": 100.00}, {"type": "C", "name": "Aziz", "num": 0, "age": 20, "dateA": "2012-01-11 00:00:00.000", "DateB": "2012-01-11 00:00:00.000", "PRICE": 349.00}, {"type": "D", "name": "Aziz", "num": 1, "age": 90, "dateA": "2012-01-11 00:00:00.000", "DateB": "2012-01-11 00:00:00.000", "PRICE": 222.00} ] df = pd.DataFrame(data) # 处理日期字段,去除时分秒 df['dateA'] = pd.to_datetime(df['dateA']).dt.date df['DateB'] = pd.to_datetime(df['DateB']).dt.date # 透视转换为宽表,拼接表头 df_pivot = df.pivot(index='name', columns='type', values=['num', 'age', 'dateA', 'DateB', 'PRICE']) df_pivot.columns = [f"{col[0]} x {col[1]}" for col in df_pivot.columns] # 重置索引,让name成为普通列 df_result = df_pivot.reset_index() # 打印结果或保存到文件 print(df_result) # df_result.to_excel('转换结果.xlsx', index=False)
内容的提问来源于stack exchange,提问作者Aziz bouchtaoui
相关产品推荐
相关产品推荐

