如何基于已有DataFrame生成按组计算均值的新DataFrame?
按Group分组计算基因列均值的实现方案
刚好我经常处理这类生物信息学的DataFrame数据,用pandas就能完美解决你的需求,步骤超简单:
首先,先把你的示例数据转换成pandas能处理的DataFrame:
import pandas as pd # 构建原始数据 raw_data = { 'gene1': [1, 2, 3, 4, 5], 'gene2': [2, 3, 4, 5, 6], 'gene3': [4, 4, 4, 4, 4], 'group': [1, 1, 1, 2, 2] } df = pd.DataFrame(raw_data, index=['sample1', 'sample2', 'sample3', 'sample4', 'sample5'])
接下来就是核心的分组求均值操作,一行代码就能搞定:
# 按group分组计算各基因列的均值,并将group从索引转为普通列 result_df = df.groupby('group').mean().reset_index()
代码解释:
df.groupby('group'):把原始DataFrame按照group列的取值(1和2)分成两个子数据集.mean():自动对每个子数据集中的数值型列(也就是gene1、gene2、gene3)计算平均值,会自动跳过非数值列.reset_index():默认情况下groupby的结果会把分组列(group)作为索引,用这个方法可以把它转成普通列,刚好匹配你想要的输出格式
运行后打印result_df,输出就是你要的结果:
group gene1 gene2 gene3 0 1 2.0 3.0 4 1 2 4.5 5.5 4
如果想让gene1的2.0显示成2(不影响数值精度的话),可以加个小调整:
# 把整数类型的均值转成int,保留小数的保持float result_df['gene1'] = result_df['gene1'].apply(lambda x: int(x) if x.is_integer() else x) result_df['gene2'] = result_df['gene2'].apply(lambda x: int(x) if x.is_integer() else x)
调整后输出就完全和你给出的目标格式一致啦。
内容的提问来源于stack exchange,提问作者Bio_farmer
相关产品推荐
相关产品推荐

