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

Python Pandas将DataFrame转换为Tidy整洁格式的方法

Pandas宽表转Tidy长格式实现方法

你提供的原始构造代码存在几处语法问题,直接运行会报错,先修正后再做转换:

  • 所有中文全角单引号替换为英文半角单引号
  • Test字段的取值列表多写了1个Math元素(其余列长度均为8,Test列原长度为9,需删除最后多余的元素)
  • 字典各键值对之间缺失的逗号补全

修正后的原始数据构造代码

import pandas as pd

dt = {'ID': [1, 1, 1, 1, 2, 2, 2, 2],   
      'Test': ['Math', 'Math', 'Writing', 'Writing', 'Math', 'Math', 'Writing', 'Writing'],
      'Year': ['2008', '2009', '2008', '2009', '2008', '2009', '2008', '2009'],
      'Fall': [15, 12, 22, 10, 12, 16, 13, 23],
      'Spring': [16, 13, 22, 14, 13, 14, 11, 20],
      'Winter': [19, 27, 24, 20, 25, 21, 29, 26]}
mydt = pd.DataFrame(dt, columns = ['ID', 'Test', 'Year', 'Fall', 'Spring', 'Winter'])

转换为Tidy格式的代码

目标Tidy结构需要把Fall/Spring/Winter三个代表学期的宽表列,转换为行存储的维度值,直接用pandas内置的melt方法即可实现:

tidy_mydt = mydt.melt(
    id_vars=['ID', 'Test', 'Year'],
    value_vars=['Fall', 'Spring', 'Winter'],
    var_name='Semester',
    value_name='Score'
).sort_values(by=['ID', 'Year', 'Test', 'Semester'], ignore_index=True)

参数说明:

  • id_vars:指定不需要转置、保留作为观测标识的列
  • value_vars:指定需要从列转换为行取值的列,这里对应三个学期列
  • var_name:转换后存储原列名(学期)的新列名
  • value_name:转换后存储原单元格数值(分数)的新列名
  • 末尾的sort_values是可选操作,用来按ID、年份、考试类型、学期排序,让输出结果更规整,不影响数据结构正确性。

转换后输出的Tidy表符合规范:每一列对应一个单独变量,每一行对应一条独立的观测记录,结构示例如下:

IDTestYearSemesterScore
1Math2008Fall15
1Math2008Spring16
1Math2008Winter19
1Math2009Fall12
1Math2009Spring13
1Math2009Winter27
1Writing2008Fall22
...............

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:39:30