如何将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
相关产品推荐
相关产品推荐

