You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定数据集转换为基因×分组的目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:25:29