R语言按列名归属合并列:基于物种-科属关系汇总丰度
按物种科属合并丰度列的Pandas解决方案
嗨,这个需求我之前做微生物组数据分析时经常碰到,用Pandas几行代码就能完美解决!下面一步步给你讲清楚怎么实现:
先明确数据结构(附示例)
假设你的df1是样本×物种的丰度表,df2是物种到科属的映射表,先模拟一组数据方便理解:
import pandas as pd # 示例:样本-物种丰度表 df1 = pd.DataFrame({ 'Sp1': [0.1, 0.2, 0.3], 'Sp3': [0.05, 0.15, 0.25], 'Sp6': [0.2, 0.1, 0.05], 'Sp2': [0.3, 0.2, 0.1], 'Sp4': [0.15, 0.25, 0.35] }, index=['Sample1', 'Sample2', 'Sample3']) # 示例:物种-科属映射表(把物种设为索引,方便后续匹配) df2 = pd.DataFrame({ 'Species': ['Sp1', 'Sp3', 'Sp6', 'Sp2', 'Sp4'], 'Family': ['Fam1', 'Fam1', 'Fam1', 'Fam2', 'Fam2'] }).set_index('Species')
核心实现代码
只需要一行关键代码,就能完成按科属分组求和,自动丢弃原物种列:
# 按科属对df1的列分组求和,axis=1表示操作列维度 df3 = df1.groupby(df2['Family'], axis=1).sum()
运行后df3就是你要的样本×科属总丰度表,示例输出如下:
| Fam1 | Fam2 | |
|---|---|---|
| Sample1 | 0.35 | 0.45 |
| Sample2 | 0.45 | 0.45 |
| Sample3 | 0.6 | 0.45 |
关键注意事项
- 物种名必须完全匹配:
df2里的物种名称要和df1的列名完全一致(包括大小写、空格、特殊字符),不然会导致部分物种无法匹配被忽略。如果有不匹配的情况,可以先做数据清洗,比如用str.strip()去除空格、统一大小写。 - 处理不匹配的物种:如果
df1有df2没收录的物种,或者反过来,分组时会自动跳过不匹配的部分。如果需要保留这些物种(比如归为“未知科属”),可以先给df2补全映射,或者用fillna设置默认分组。 - 扩展到多级分类:如果你的分类层级更多(比如门、纲、目),只需要把
groupby的依据换成对应的列就行,比如df1.groupby(df2['Order'], axis=1).sum()。
内容的提问来源于stack exchange,提问作者ayesha
相关产品推荐
相关产品推荐

