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

求助:如何使用Python Pandas实现表格的反规范化?

Pandas表格反规范化实操指南

先模拟你的原表数据

根据你提供的第一张图,假设原表结构是这样的(ID、姓名,加上多列课程):

IDNameCourse_1Course_2Course_3
1AliceMathEnglishPhysics
2BobChemistryBiology
3CharlieHistoryMath

用Pandas构造这个表的代码:

import pandas as pd

df = pd.DataFrame({
    'ID': [1, 2, 3],
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Course_1': ['Math', 'Chemistry', 'History'],
    'Course_2': ['English', '', 'Math'],
    'Course_3': ['Physics', 'Biology', '']
})

执行反规范化(宽转长)

用melt函数直接搞定,还能过滤空值:

# 把多列课程拆成多行
melted_df = df.melt(
    id_vars=['ID', 'Name'],  # 保留不拆分的列
    value_vars=['Course_1', 'Course_2', 'Course_3'],  # 需要拆分的课程列
    value_name='Course'  # 新生成的课程列名
)

# 去掉空的课程行,重置索引
result_df = melted_df[melted_df['Course'] != ''].reset_index(drop=True)
# 如果不需要记录原课程列的名称(比如Course_1),直接删掉对应列就行
# result_df = result_df.drop('variable', axis=1)

最终结果

运行后就得到你要的格式:

IDNameCourse
1AliceMath
1AliceEnglish
1AlicePhysics
2BobChemistry
2BobBiology
3CharlieHistory
3CharlieMath

额外提示

  • 如果原表的空值是NaN而不是空字符串,过滤条件改成melted_df['Course'].notna()就行。
  • 要是课程列特别多,不用手动列出来,用[col for col in df.columns if col.startswith('Course_')]自动生成要拆分的列列表。

内容的提问来源于stack exchange,提问作者Work All

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:55:20