
本文介绍如何使用 pandas 的 pd.concat() 高效合并字典中的多个 DataFrame,并自动将字典键作为新列(首列)加入结果 DataFrame,避免手动构造索引或循环拼接。
本文介绍如何使用 pandas 的 `pd.concat()` 高效合并字典中的多个 dataframe,并自动将字典键作为新列(首列)加入结果 dataframe,避免手动构造索引或循环拼接。
在生物信息学或批量数据处理场景中,常需将按基因 ID、样本 ID 或其他标识符组织的多个 DataFrame(如不同基因的表达矩阵)合并为一个统一表格,同时保留原始分组标识。直接调用 pd.concat(..., keys=...) 会将键作为 MultiIndex 的第一级,但默认不转为普通列——此时需结合 .reset_index() 提升索引层级。
正确做法是:利用 keys 参数生成带名称的外层索引,再通过 reset_index(0) 将其“降维”为普通列。推荐写法如下:
import pandas as pd
# 示例数据(字典结构)
test_list = {
'ENSMUSG00000025333.10': pd.DataFrame({
'treatment_code': [0, 1],
'subjectCode': [2, 4],
'fraction_modified_entropy_in_log2': [1.822939, 0.811278],
'log_RPKM': [3.109444, 3.476707]
}, index=[59478, 107087]),
'ENSMUSG00000025903.14': pd.DataFrame({
'treatment_code': [0, 1],
'subjectCode': [1, 3],
'fraction_modified_entropy_in_log2': [1.000000, 3.551271],
'log_RPKM': [3.175110, 3.002025]
}, index=[178498, 107116]),
'ENSMUSG00000063663.11': pd.DataFrame({
'treatment_code': [0, 1],
'subjectCode': [2, 3],
'fraction_modified_entropy_in_log2': [2.755851, 3.088372],
'log_RPKM': [1.07040, 1.19147]
}, index=[59417, 118918])
}
# ✅ 推荐:直接传入字典 + 指定 names + reset_index(0)
result = (
pd.concat(test_list, ignore_index=False, names=['gene_id'])
.reset_index(0)
)
print(result.head())
输出效果:
gene_id treatment_code subjectCode fraction_modified_entropy_in_log2 log_RPKM 59478 ENSMUSG00000025333.10 0 2 1.822939 3.109444 107087 ENSMUSG00000025333.10 1 4 0.811278 3.476707 178498 ENSMUSG00000025903.14 0 1 1.000000 3.175110 107116 ENSMUSG00000025903.14 1 3 3.551271 3.002025 59417 ENSMUSG00000063663.11 0 2 2.755851 1.070400
✅ 关键要点说明:
- pd.concat(test_list, ...) 等价于 pd.concat(test_list.values(), keys=test_list.keys()),更简洁且不易出错;
- names=['gene_id'] 为外层索引命名,便于后续 reset_index(0) 明确指定提升哪一级;
- reset_index(0) 仅重置第 0 级索引(即 gene_id),保留原 DataFrame 行索引(如 59478, 107087 等),确保数据对齐无损;
- 若需重置全部索引,可改用 reset_index(drop=False),但通常保留原始行索引更有意义(尤其涉及下游定位或关联操作)。
⚠️ 注意事项:
- 若各子 DataFrame 列名不完全一致,concat 会自动对齐并填充 NaN,建议提前校验列结构;
- ignore_index=False 是默认行为,显式写出仅为强调保留原始索引逻辑;
- 如需去重或排序,可在 reset_index() 后链式调用 .sort_values('gene_id') 或 .drop_duplicates()。
掌握这一模式,即可在单行代码中完成“键→列”的语义化合并,大幅提升批量数据整合效率与可读性。











