如何对包含列表值列的Pandas DataFrame执行透视转换得到目标宽表
问题原因
你之前使用pivot_table出现B列被跳过的问题,是因为pivot_table默认会对值列执行均值聚合,列表类型无法参与数值运算,会被自动过滤。
解决方案1:使用pivot(推荐,适配你的场景)
你的数据中每个i和name的组合仅有唯一一行,不需要聚合,直接用pivot即可完整保留所有值,包括列表:
# 核心转换代码 df_pivot = df.pivot(index='i', columns='name', values=['A', 'B']) # 按照「name值_原列名」规则拼接列名 df_pivot.columns = [f"{col[1]}_{col[0]}" for col in df_pivot.columns] # 调整列顺序并把i从索引恢复为普通列 df_pivot = df_pivot.reset_index()[['x_A', 'x_B', 'y_A', 'y_B', 'z_A', 'z_B', 'i']]
运行后得到的结果完全符合要求,B列的列表值会完整保留。
解决方案2:自定义pivot_table聚合规则(兼容多值场景)
如果你的实际业务中存在同一个i和name对应多行数据的情况,可以给pivot_table指定自定义聚合函数,避免列表被过滤:
# 自定义aggfunc取分组内第一个值,可根据需求调整为列表拼接等逻辑 df_pivot = df.pivot_table( index='i', columns='name', values=['A', 'B'], aggfunc=lambda x: x.iloc[0] ) # 后续列名拼接、顺序调整逻辑和方案1完全一致 df_pivot.columns = [f"{col[1]}_{col[0]}" for col in df_pivot.columns] df_pivot = df_pivot.reset_index()[['x_A', 'x_B', 'y_A', 'y_B', 'z_A', 'z_B', 'i']]
内容的提问来源于stack exchange,提问作者pariskey
相关产品推荐
相关产品推荐

