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

如何使用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_IDSampleAuthor
s1AAbe
s2BBen
s3CCat

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_IDInstrument
i1Bucket
i2Bucket with Hole
i3Jug

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_IDSample_IDInstrument_IDDateData1Data2
d1s1i12022-01-0110
d2s1i12022-01-0201
d3s1i12022-01-0333
d4s1i22022-01-0431
d5s2i32022-01-0121
d6s3i32022-01-0112

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:10:32