如何对DataFrame按列值分组并实现指定格式转置?
实现长格式DataFrame转宽格式的方案
当然可以实现需求中的转置操作,核心是将PRODUCTNUMBER与Talle proveedor的取值组合作为行的唯一标识,再将ATTRIBUTETYPENAME的各个取值转为列名。以下是用pandas实现的具体步骤:
1. 构造示例长格式数据
先模拟你描述的长格式DataFrame结构:
import pandas as pd # 示例数据 data = [ ["ADAC5262", "颜色", "红色"], ["ADAC5262", "材质", "棉质"], ["ADAC5262", "Talle proveedor", "1"], ["ADAC5262", "颜色", "红色"], ["ADAC5262", "材质", "棉质"], ["ADAC5262", "Talle proveedor", "2"], ["ADAC5262", "颜色", "蓝色"], ["ADAC5262", "材质", "涤纶"], ["ADAC5262", "Talle proveedor", "4126"], ["ADAC5263", "颜色", "黑色"], ["ADAC5263", "材质", "羊毛"], ["ADAC5263", "Talle proveedor", "3"], ] df_long = pd.DataFrame(data, columns=["PRODUCTNUMBER", "ATTRIBUTETYPENAME", "TEXTVALUE"])
2. 标记每个Talle分组
因为同一PRODUCTNUMBER下的属性是按Talle proveedor分组的,我们先给每个分组添加标记:
# 给每个PRODUCTNUMBER下的不同Talle组添加序号标记 df_long["talle_group"] = (df_long["ATTRIBUTETYPENAME"] == "Talle proveedor").groupby(df_long["PRODUCTNUMBER"]).cumsum()
3. 转置为宽格式
使用pivot_table完成转置,确保每个PRODUCTNUMBER+Talle proveedor组合对应一行:
# 转置操作 df_wide = df_long.pivot_table( index=["PRODUCTNUMBER", "talle_group"], columns="ATTRIBUTETYPENAME", values="TEXTVALUE", aggfunc="first" # 取分组内第一个值,处理重复属性行 ).reset_index() # 移除辅助分组列,调整列顺序 df_wide = df_wide.drop("talle_group", axis=1) cols = ["PRODUCTNUMBER", "Talle proveedor"] + [col for col in df_wide.columns if col not in ["PRODUCTNUMBER", "Talle proveedor"]] df_wide = df_wide[cols]
最终结果
转置后的宽格式DataFrame结构如下:
PRODUCTNUMBER Talle proveedor 颜色 材质 0 ADAC5262 1 红色 棉质 1 ADAC5262 2 红色 棉质 2 ADAC5262 4126 蓝色 涤纶 3 ADAC5263 3 黑色 羊毛
如果你的原始数据中,同一PRODUCTNUMBER+Talle proveedor组合下的属性没有重复值,也可以用更简洁的pivot方法替代pivot_table:
df_wide = df_long.pivot( index=["PRODUCTNUMBER", "talle_group"], columns="ATTRIBUTETYPENAME", values="TEXTVALUE" ).reset_index().drop("talle_group", axis=1)
内容的提问来源于stack exchange,提问作者Maximiliano Vazquez
相关产品推荐
相关产品推荐

