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

如何根据索引子串为多索引DataFrame的type列赋值?

修正DataFrame中type列的标签赋值问题

你需要根据DataFrame索引的结尾规则给type列赋值:

  • 索引以01A-09A结尾 → 标记为tumor
  • 索引以10A-19A结尾 → 标记为normal

当前代码尝试用assign生成布尔列后再replace,但最终type列仍为布尔值,未完成标签替换。

问题原因

  1. 原代码的replace操作在多重索引列的场景下,无法正确定位到type列的布尔值完成替换;
  2. 原正则r'0[1-9]'仅匹配数字部分,未限定结尾的A,存在误匹配风险(比如索引中包含01但不在结尾位置的情况)。

修正方案

以下是几种可靠的实现方式,直接生成目标字符串标签,避免replace的潜在问题:

方案1:用np.where结合str.endswith

import numpy as np

# 01-09A : tumor; 10-19A : normal
tumor_suffixes = tuple(f"{i:02d}A" for i in range(1, 10))
normal_suffixes = tuple(f"{i:02d}A" for i in range(10, 20))

meth_450_5_kipan = meth_450_5_kipan.assign(
    type=np.where(
        meth_450_5_kipan.index.str.endswith(tumor_suffixes),
        "tumor",
        np.where(
            meth_450_5_kipan.index.str.endswith(normal_suffixes),
            "normal",
            None  # 可选:处理不符合两种规则的索引,可替换为默认值
        )
    )
).dropna(axis=1)

方案2:正则提取数字后判断范围

meth_450_5_kipan = meth_450_5_kipan.assign(
    type=meth_450_5_kipan.index.str.extract(r'(\d{2})A$', expand=False)
    .astype(int)
    .apply(lambda x: 'tumor' if 1 <= x <= 9 else 'normal' if 10 <= x <= 19 else None)
).dropna(axis=1)

方案3:简化原代码的替换逻辑

如果坚持使用原代码的结构,需要确保replace直接作用于type列,可调整为:

meth_450_5_kipan = meth_450_5_kipan.assign(
    type=meth_450_5_kipan.index
    .str.split('-')
    .str[-1]
    .str.contains(r'0[1-9]A$', regex=True)  # 补充A$限定结尾
).assign(
    type=lambda df: df['type'].map({True: 'tumor', False: 'normal'})
).dropna(axis=1)

说明

  • 方案1和2更直观且不易出错,能精准匹配索引结尾的规则;
  • 若存在不符合两种规则的索引,可将None替换为你需要的默认标签(比如'unknown')。

内容的提问来源于stack exchange,提问作者melolilili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:40:26