如何使用Pandas拆分DataFrame为可通过join还原的多关系表?
在Pandas中拆分数据表为关系型结构并可还原
当然可以通过提取重复维度数据生成独立表、用ID关联的方式来拆分大型数据集,这种方法就是数据规范化,能大幅减少冗余,且完全可以通过后续的join操作还原原始数据。下面针对你的示例一步步实现:
1. 准备原始数据
首先运行代码生成原始数据表:
import pandas as pd data = { '1': ['A', 'Abe', 'Bucket', '2022-01-01', 1,0], '2': ['A', 'Abe', 'Bucket', '2022-01-02', 0,1], '3': ['A', 'Abe', 'Bucket', '2022-01-03', 3,3], '4': ['A', 'Abe', 'Bucket with Hole', '2022-01-04', 3,1], '5': ['B', 'Ben', 'Jug', '2022-01-01', 2,1], '6': ['C', 'Cat', 'Jug', '2022-01-01', 1,2]} joined_df = pd.DataFrame.from_dict(data, orient='index', columns=['Sample', 'Author','Instrument', 'Date', 'Data1','Data2'])
2. 生成Samples表
提取Sample和Author的唯一组合,为每个组合分配唯一ID:
# 提取唯一的Sample-Author组合 samples_df = joined_df[['Sample', 'Author']].drop_duplicates().reset_index(drop=True) # 添加格式为s1、s2的Sample_ID samples_df['Sample_ID'] = 's' + (samples_df.index + 1).astype(str) # 调整列顺序为要求的格式 samples_df = samples_df[['Sample_ID', 'Sample', 'Author']]
生成的Samples表:
| Sample_ID | Sample | Author |
|---|---|---|
| s1 | A | Abe |
| s2 | B | Ben |
| s3 | C | Cat |
3. 生成Instrument表
提取唯一的Instrument条目,分配唯一ID:
# 提取唯一的Instrument instrument_df = joined_df[['Instrument']].drop_duplicates().reset_index(drop=True) # 添加格式为i1、i2的Instrument_ID instrument_df['Instrument_ID'] = 'i' + (instrument_df.index + 1).astype(str) # 调整列顺序 instrument_df = instrument_df[['Instrument_ID', 'Instrument']]
生成的Instrument表:
| Instrument_ID | Instrument |
|---|---|
| i1 | Bucket |
| i2 | Bucket with Hole |
| i3 | Jug |
4. 生成Data表
将原表中的维度字段映射为对应的ID,保留数据字段并添加Data_ID:
# 映射Sample_ID到原表 temp_df = joined_df.merge(samples_df, on=['Sample', 'Author'], how='left') # 映射Instrument_ID到原表 data_df = temp_df.merge(instrument_df, on='Instrument', how='left') # 提取需要的列并添加Data_ID data_df = data_df[['Sample_ID', 'Instrument_ID', 'Date', 'Data1', 'Data2']] data_df['Data_ID'] = 'd' + (data_df.index + 1).astype(str) # 调整列顺序为要求的格式 data_df = data_df[['Data_ID', 'Sample_ID', 'Instrument_ID', 'Date', 'Data1', 'Data2']]
生成的Data表:
| Data_ID | Sample_ID | Instrument_ID | Date | Data1 | Data2 |
|---|---|---|---|---|---|
| d1 | s1 | i1 | 2022-01-01 | 1 | 0 |
| d2 | s1 | i1 | 2022-01-02 | 0 | 1 |
| d3 | s1 | i1 | 2022-01-03 | 3 | 3 |
| d4 | s1 | i2 | 2022-01-04 | 3 | 1 |
| d5 | s2 | i3 | 2022-01-01 | 2 | 1 |
| d6 | s3 | i3 | 2022-01-01 | 1 | 2 |
5. 验证数据还原
通过join操作可以完全还原原始数据表:
# 关联三个表还原原始数据 restored_df = data_df.merge(samples_df, on='Sample_ID', how='left')\ .merge(instrument_df, on='Instrument_ID', how='left')\ [['Sample', 'Author', 'Instrument', 'Date', 'Data1', 'Data2']] # 检查还原后的数据是否与原表一致(忽略索引差异) print(restored_df.equals(joined_df.reset_index(drop=True))) # 输出True
内容的提问来源于stack exchange,提问作者RedM
相关产品推荐
相关产品推荐

