Python Pandas 如何将s1/s2/s3列重构为单列的DataFrame长表
宽表转长表实现方法
这类多列同维度值拆分为单列行的结构重构,是pandas非常经典的宽转长场景,不需要手动写循环遍历,用内置melt()方法即可高效实现,完全匹配目标输出要求。
核心实现代码
# 拆分s1/s2/s3为单列s,保留Student、code两列作为行标识 new_df = old_df.melt( id_vars=["Student", "code"], # 拆分时需要原样重复保留的列 value_vars=["s1", "s2", "s3"], # 需要拆分合并为单列的列 value_name="s", # 拆分后生成的新单列的列名 var_name=None # 不保留原列名生成的临时标识列 ) # 可选1:调整列顺序,完全匹配目标表的列排列 new_df = new_df[["Student", "s", "code"]] # 可选2:调整行顺序,对齐示例的学生分组排列效果 new_df = new_df.sort_values("Student").reset_index(drop=True)
方法特性
- 该方法为pandas原生结构转换方法,运行效率远高于手动
iterrows()遍历构造列表的方案 - 拆分过程会完整保留所有原始值,包括NaN,不会因为空值跳过行,刚好对应示例中C、D学生的空值行需求
- 自动为每一行拆分后的值重复填充对应的Student、code标识,不需要手动维护列值的对应关系
手动遍历方案的核心问题
之前写的循环逻辑仅提取了每行的s1值,既没有遍历s2、s3两列的内容,手动拼接一维列表的写法也很容易打乱不同列值的对应关系,属于典型的冗余实现,容易产生bug。
内容的提问来源于stack exchange,提问作者QGIS_krig
相关产品推荐
相关产品推荐

