微生物测序分类学数据的DataFrame特定合并方法问询
解决方案:用Pandas实现微生物测序分类学数据合并
针对你需要合并多个样本分类学DataFrame的需求,用Pandas的concat+pivot_table组合就能完美实现,具体步骤如下:
1. 准备样本数据
假设你的每个样本DataFrame结构如下(以df1、df2为例):
import pandas as pd # 示例df1 df1 = pd.DataFrame({ 'lineage': ['Bacteria;Firmicutes', 'Bacteria;Proteobacteria'], 'taxonomy': ['phylum;Firmicutes', 'phylum;Proteobacteria'], 'count': [120, 80] }) # 示例df2 df2 = pd.DataFrame({ 'lineage': ['Bacteria;Firmicutes', 'Bacteria;Actinobacteria'], 'taxonomy': ['phylum;Firmicutes', 'phylum;Actinobacteria'], 'count': [150, 90] })
2. 给每个样本添加标识列
给每个DataFrame新增sample列,标记所属样本:
df1['sample'] = 'df1' df2['sample'] = 'df2'
3. 合并所有样本数据
把所有样本DataFrame合并成一个大表:
combined_data = pd.concat([df1, df2], ignore_index=True)
4. 重构表格生成最终格式
用pivot_table将样本名转为列,缺失计数自动补0,同时保留lineage和taxonomy的一一对应关系:
final_df = combined_data.pivot_table( index=['lineage', 'taxonomy'], # 以lineage和taxonomy为索引,确保一一对应 columns='sample', # 将样本名转为列 values='count', # 提取count值 fill_value=0, # 缺失值补0 aggfunc='sum' # 同一样本重复lineage时求和(测序数据常用逻辑) ).reset_index() # 重命名列,统一为count_样本名的格式 final_df.columns = ['lineage', 'taxonomy'] + [f'count_{col}' for col in final_df.columns[2:]]
最终输出结果
运行后得到的final_df格式完全符合你的要求:
| lineage | taxonomy | count_df1 | count_df2 |
|---|---|---|---|
| Bacteria;Actinobacteria | phylum;Actinobacteria | 0 | 90 |
| Bacteria;Firmicutes | phylum;Firmicutes | 120 | 150 |
| Bacteria;Proteobacteria | phylum;Proteobacteria | 80 | 0 |
注意事项
- 如果你的样本DataFrame中存在同一个lineage对应多个taxonomy的情况(违反你说的一一对应规则),需要先清理数据,比如用
df.drop_duplicates(subset='lineage', keep='first')保留每个lineage的第一个taxonomy条目 - 合并6个样本时,只需要把所有样本DataFrame加入
concat的列表即可,后续代码无需修改 - 若确定同一样本内没有重复的lineage,
aggfunc可以改用'first',不影响结果
内容的提问来源于stack exchange,提问作者abby23
相关产品推荐
相关产品推荐

