如何将指定数据集转换为基因×分组的目标DataFrame?
需求背景
给定如下数据集:
import pandas as pd data = {'weight': ['NaN',2,3,4,'NaN',6,7,8,9,'NaN',11,12,13,14,15], 'MI': ['NaN', 21, 19, 18, 'NaN',16,15,14,13,'NaN',11,10,9,8,7]} df = pd.DataFrame(data, index= ['group1', "gene1", "gene2", 'gene3', 'group2', "gene1", 'gene21', 'gene4', 'gene7', 'group3', 'gene2', 'gene10', 'gene3', 'gene43', 'gene1'])
需要完成以下数据转换:
- 移除
weight列,仅保留MI值 - 转换为基因为行、分组为列的结构
- 分组中无对应基因的MI值时,填充为
0.1
解决方案
步骤1:预处理并提取分组-基因-MI对应关系
先把原始数据中的字符串'NaN'替换为pandas可识别的缺失值,再拆分每个分组对应的基因和MI值:
# 替换字符串缺失值为标准NaN df = df.replace('NaN', pd.NA) # 定位所有分组标签的位置 group_names = df.index[df.index.str.startswith('group')].tolist() group_list = [] gene_list = [] mi_list = [] # 遍历每个分组,提取其下的基因和对应MI值 for idx, group in enumerate(group_names): group_pos = df.index.get_loc(group) # 确定当前分组下基因的索引范围 if idx == len(group_names)-1: gene_range = df.index[group_pos+1:] else: next_group_pos = df.index.get_loc(group_names[idx+1]) gene_range = df.index[group_pos+1 : next_group_pos] # 收集数据 for gene in gene_range: group_list.append(group) gene_list.append(gene) mi_list.append(df.loc[gene, 'MI'])
步骤2:透视转换并填充缺失值
用透视表实现行、列的转换,同时填充缺失值:
# 构建临时DataFrame temp_df = pd.DataFrame({'group': group_list, 'gene': gene_list, 'MI': mi_list}) # 透视生成目标结构,缺失值填充0.1 result_df = temp_df.pivot(index='gene', columns='group', values='MI').fillna(0.1) # 可选:简化列名(去掉group前缀) result_df.columns = result_df.columns.str.replace('group', '')
最终结果示例
运行代码后得到的DataFrame结构如下:
1 2 3 gene1 21.0 16.0 7.0 gene2 19.0 0.1 11.0 gene3 18.0 0.1 9.0 gene21 0.1 15.0 0.1 gene4 0.1 14.0 0.1 gene7 0.1 13.0 0.1 gene10 0.1 0.1 10.0 gene43 0.1 0.1 8.0
内容的提问来源于stack exchange,提问作者Yulia Kentieva
相关产品推荐
相关产品推荐

