如何合并两个同结构pandas DataFrame以生成MultiIndex数据框
两种合并生成MultiIndex DataFrame的可落地实现
首先复现题目中的两个示例数据,直接运行以下代码即可得到和题目一致的初始数据:
import pandas as pd dfaa = pd.DataFrame( [['id1', 1, 2, 3, 3], ['id2',4, 5, 6,6 ], ['id3', 7, 8, 9,9]], columns=['prod_id','a', 'b','c','number of prod variants'] ) dfbb = pd.DataFrame( [['id1', 1.1, 2.2, 3.3, 3], ['id2',4.4, 5.4, 6.6,6 ], ['id3', 7.7, 8.8, 9.9,9]], columns=['prod_id','a', 'b','c','number of prod variants'] )
方案1:上层为特征名、下层标记数据来源
完全匹配第一种思路的结构:列索引分两层,第一层对应原数据的所有特征字段(产品ID、a/b/c特征值、变体总数量),第二层分别存两个原数据框对应位置的取值。后续要修改下层列名(比如把默认的来源标记改成a_vals、a_unique这类业务名)没有任何实现障碍。
核心实现代码:
# 按列方向拼接两个数据框,先绑定来源标记作为下层索引 merged_by_feature = pd.concat( [dfaa, dfbb], axis=1, keys=['source_aa', 'source_bb'], names=['data_source', 'feature_name'] ) # 交换索引层级,把特征名提到上层索引位置 merged_by_feature = merged_by_feature.swaplevel(0, 1, axis=1).sort_index(axis=1) # 按需修改下层列名,比如把来源标记替换成业务含义名称 merged_by_feature.columns = merged_by_feature.columns.set_levels( ['aa_original_val', 'bb_processed_val'], level=1 )
提示:两个原数据框的
prod_id、number of prod variants列取值完全一致,生成的合并结果里这两列会存在重复的取值列,后续筛选时保留任意一组即可,直接删掉冗余列不影响使用。
方案2:列拼接后新增属性标注层
对应第二种思路的结构:先把所有特征按列拼合,最上层新增一层索引专门标注列的属性信息,比如数据来源、非空值占比、唯一值数量这类标签,后续加新的属性标记不需要改动底层的列顺序和数据内容。
核心实现代码:
# 拆分公共主键列和特征列,避免重复存储完全一致的内容 common_cols = ['prod_id', 'number of prod variants'] base_data = dfaa[common_cols] # 两个df的公共列完全相同,只保留一份减少冗余 feat_part_aa = dfaa.drop(columns=common_cols).add_suffix('_aa') feat_part_bb = dfbb.drop(columns=common_cols).add_suffix('_bb') # 按列拼合所有内容 base_concat = pd.concat([base_data, feat_part_aa, feat_part_bb], axis=1) # 给每一列匹配对应的属性标签,后续可以随时追加新标签 col_attr_tags = [] for col_name in base_concat.columns: if col_name in common_cols: col_attr_tags.append('common_identifier') elif col_name.endswith('_aa'): col_attr_tags.append('feature_from_aa') else: col_attr_tags.append('feature_from_bb') # 生成两层结构的MultiIndex列 base_concat.columns = pd.MultiIndex.from_arrays( [col_attr_tags, base_concat.columns], names=['col_attr', 'raw_col_name'] )
提示:上层的属性标签支持随时扩展,比如后续计算列的空值率、唯一值规模、数据类型,直接在这层索引里追加对应标记就行,不需要调整原始的存储结构。
内容的提问来源于stack exchange,提问作者anama
相关产品推荐
相关产品推荐

