求助:如何使用Python Pandas实现表格的反规范化?
Pandas表格反规范化实操指南
先模拟你的原表数据
根据你提供的第一张图,假设原表结构是这样的(ID、姓名,加上多列课程):
| ID | Name | Course_1 | Course_2 | Course_3 |
|---|---|---|---|---|
| 1 | Alice | Math | English | Physics |
| 2 | Bob | Chemistry | Biology | |
| 3 | Charlie | History | Math |
用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)
最终结果
运行后就得到你要的格式:
| ID | Name | Course |
|---|---|---|
| 1 | Alice | Math |
| 1 | Alice | English |
| 1 | Alice | Physics |
| 2 | Bob | Chemistry |
| 2 | Bob | Biology |
| 3 | Charlie | History |
| 3 | Charlie | Math |
额外提示
- 如果原表的空值是
NaN而不是空字符串,过滤条件改成melted_df['Course'].notna()就行。 - 要是课程列特别多,不用手动列出来,用
[col for col in df.columns if col.startswith('Course_')]自动生成要拆分的列列表。
内容的提问来源于stack exchange,提问作者Work All
相关产品推荐
相关产品推荐

