Pandas如何将长格式DataFrame转换为槽位分栏的宽格式DataFrame
Pandas长表转宽表实现方案
你需要将记录单槽位单板信息的长表,按设备名(Name)分组展开为每个槽位对应单板的宽表,实现逻辑如下:
核心思路
- 原始数据是典型的长表结构:每行对应「某设备某槽位插了某块单板」的单条记录
- 目标是行转列:以Name为行标识,槽位号为列标识,填充对应的Board值,缺失槽位留空
- 需要额外补全目标要求的0-5全部6个槽位列,避免部分槽位无数据时列缺失
完整实现代码
import pandas as pd # 替换为你自己的数据读取逻辑,比如pd.read_csv()、pd.read_excel() df = pd.DataFrame( [ [55, "WD22UBBPe4", 3], [14, "WD22UBBPd6", 2], [14, "QWL1WBBPF4", 3], [14, "QWL1WBBPD2", 0], [14, "WD22LBBPD2", 1], [16, "QWL1WBBPD2", 4], [16, "QWL1WBBPD2", 3], [16, "WD22UBBPd6", 2], [16, "QWL1WBBPD2", 0], [16, "QWL1WBBPD2", 1], [72, "QWL1WBBPD2", 0], [72, "WD22LBBPD2", 1], [72, "WD22UBBPd6", 2], [72, "QWL1WBBPD2", 3] ], columns=["Name", "Board", "Slot No."] ) # 行转列操作 res = df.pivot(index="Name", columns="Slot No.", values="Board") # 补全0-5所有槽位列,空值填充为空字符串 res = res.reindex(columns=range(6), fill_value="") # 重命名列,重置索引得到最终表 res.columns = [f"Slot {i}" for i in range(6)] res = res.reset_index()
输出结果
运行代码后得到的结果和目标格式完全一致:
| Name | Slot 0 | Slot 1 | Slot 2 | Slot 3 | Slot 4 | Slot 5 |
|---|---|---|---|---|---|---|
| 14 | QWL1WBBPD2 | WD22LBBPD2 | WD22UBBPd6 | QWL1WBBPF4 | ||
| 16 | QWL1WBBPD2 | QWL1WBBPD2 | WD22UBBPd6 | QWL1WBBPD2 | QWL1WBBPD2 | |
| 55 | WD22UBBPe4 | |||||
| 72 | QWL1WBBPD2 | WD22LBBPD2 | WD22UBBPd6 | QWL1WBBPD2 |
若需要保持Name列的原始出现顺序(即55排在第一行),可以在pivot前添加代码将Name转为指定顺序的分类类型:
df["Name"] = pd.Categorical(df["Name"], categories=df["Name"].drop_duplicates(), ordered=True)
内容的提问来源于stack exchange,提问作者cklee
相关产品推荐
相关产品推荐

