You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pandas DataFrame重复4行块转置为指定宽表?

解决Pandas中重复分组下的属性转置问题

你的核心问题是同一个Device+Serial组合下存在多个软件,但缺少区分不同软件的标识,导致转置时无法将每个软件的4项属性合并到同一行。以下是可行的解决方案:

步骤1:生成软件分组标识

因为每4行对应一个完整的软件信息,我们可以为每个软件生成唯一的分组ID,确保同一个软件的4行数据共享同一个ID:

import pandas as pd

# 生成分组ID:对每个Device+Serial分组后,行号整除4得到软件组号
df['software_group'] = df.groupby(['Device', 'Serial']).cumcount() // 4

步骤2:转置为宽表结构

将分组ID加入索引后,再进行转置操作,即可避免重复索引错误,同时将同一软件的属性合并到一行:

方法一:使用set_index+unstack

result = (df.set_index(['Device', 'Serial', 'software_group', 'Property'])['Value']
          .unstack('Property')  # 将Property列转置为表头
          .reset_index()
          .drop(columns='software_group')  # 移除临时分组列
          .rename_axis(None, axis=1))  # 清除表头的轴名称

方法二:使用pivot_table

如果担心数据有异常重复值,可以用pivot_table指定聚合函数取第一个有效值:

result = df.pivot_table(
    index=['Device', 'Serial', 'software_group'],
    columns='Property',
    values='Value',
    aggfunc='first'  # 每个属性只取第一个值
).reset_index().drop(columns='software_group').rename_axis(None, axis=1)

为什么你的原方法失败?

你之前的代码将原DataFrame的索引(append=True)加入了多层索引,但原索引是全局唯一的,导致每个Property单独占据一行,unstack后自然会出现大量NaN。本质是没有添加区分同一设备下不同软件的标识,无法将4行属性关联到同一个软件。

示例输出

运行上述代码后,你将得到期望的结构:

Device    Serial       Display Name Install Date  Publisher        Version
0  Computer2A  ABCSFT2   Microsoft Edge    2/22/2025   Microsoft  133.0.3065.92
1  Computer2A  ABCSFT2  MSVC++ 2022 X64   8/13/2024   Microsoft  14.40.33810

内容的提问来源于stack exchange,提问作者CheeseSteak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:18:28