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

嵌套字典中识别二元/标签编码列失败:代码返回空字典求助

问题:识别嵌套字典中DataFrame的二元标签编码列失败

我尝试识别嵌套字典train_data_dict中所有DataFrame的二元值/标签编码列,赋值给y_label_encoded_columns,但当前代码返回空字典。

原代码

# Identify label-encoded columns from all dataframes in the nested dictionary
y_label_encoded_columns = {}
for outer_key, inner_dict in train_data_dict.items():
    for inner_key, inner_value in inner_dict.items():
        if isinstance(inner_value, pd.DataFrame):
            label_encoded_columns = inner_value.select_dtypes(include=['int', 'float']).columns[inner_value.nunique() == 2]
            y_label_encoded_columns[(outer_key, inner_key)] = label_encoded_columns

输入数据

train_data_dict = {'transcriptomics': {'transcriptomics_df': (            gene_1    gene_2    gene_3    gene_4    gene_5    gene_6  
   sample_8  0.324889  0.282243  0.921885  0.408865  0.000000  0.519652   
   sample_3  0.715960  0.232156  0.310729  0.498760  0.573144  1.000000   
   sample_5  1.000000  0.532265  0.619240  0.192590  1.000000  0.916358   
   sample_4  0.000000  1.000000  1.000000  1.000000  0.216677  0.592965   
   sample_7  0.392615  0.574217  0.785394  0.000000  0.821214  0.000000   
   
               gene_7    gene_8    gene_9   gene_10  
   sample_8  0.905142  0.000000  0.757505  0.378347  
   sample_3  0.000000  0.929344  0.493086  0.690365  
   sample_5  1.000000  0.192423  0.243973  0.311958  
   sample_4  0.912722  0.725308  0.133332  0.867666  
   sample_7  0.818003  0.325888  0.000000  1.000000  ,
             survival  immune
   sample_8         1       0
   sample_3         0       0
   sample_5         0       1
   sample_4         0       0
   sample_7         0       1),
  'mrna_deconv': (          mrna_cell_type_1  mrna_cell_type_2  mrna_cell_type_3  
   sample_8          0.366512          0.000000          0.245887   
   sample_3          0.332385          0.682703          0.522181   
   sample_5          1.000000          0.025130          0.358275   
   sample_4          0.412620          1.000000          1.000000   
   sample_7          0.000000          0.600609          0.284344   
   
             mrna_cell_type_4  mrna_cell_type_5  
   sample_8          0.143968          0.850287  
   sample_3          0.902649          0.132099  
   sample_5          0.115818          1.000000  
   sample_4          0.000000          0.959242  
   sample_7          1.000000          0.934358  ,
             survival  immune
   sample_8         1       0
   sample_3         0       0
   sample_5         0       1
   sample_4         0       0
   sample_7         0       1)},
 'epigenomics': {'epigenomics_df': (          methyl_1  methyl_2  methyl_3  methyl_4  methyl_5  methyl_6  
   sample_8  0.648307  0.000000  0.317773  0.261844  0.178545  0.466456   
   sample_3  0.403001  0.494575  0.847600  1.000000  0.455849  0.252746   
   sample_5  0.767676  0.359736  0.705968  0.272183  0.045604  0.138116   
   sample_4  0.047227  1.000000  0.000000  0.000000  0.034345  1.000000   
   sample_7  0.000000  0.130327  1.000000  0.703201  0.553393  0.116700   
   
             methyl_7  methyl_8  
   sample_8  0.953612  0.210986  
   sample_3  0.581519  0.509216  
   sample_5  0.000000  0.349948  
   sample_4  0.754646  1.000000  
   sample_7  0.818478  0.180805  ,
             survival  immune
   sample_8         1       0
   sample_3         0       0
   sample_5         0       1
   sample_4         0       0
   sample_7         0       1),
  'meth_deconv': (          meth_cell_type_1  meth_cell_type_2  meth_cell_type_3  
   sample_8          0.683553          0.299173          0.952748   
   sample_3          0.000000          0.028041          0.706878   
   sample_5          0.027151          0.470113          0.796396   
   sample_4          1.000000          0.179501          1.000000   
   sample_7          0.913862          1.000000          0.000000   
   
             meth_cell_type_4  meth_cell_type_5  
   sample_8          0.020950          0.897815  
   sample_3          0.000000          0.000000  
   sample_5          0.014384          0.089535  
   sample_4          1.000000          0.795399  
   sample_7          0.419708          0.425495  ,
             survival  immune
   sample_8         1       0
   sample_3         0       0
   sample_5         0       1
   sample_4         0       0
   sample_7         0       1)},
 'proteomics': {'proteomics_df': (          protein_1  protein_2  protein_3  protein_4  protein_5
   sample_8   0.640386   0.158279   0.127003   0.246877   0.126281
   sample_3   0.995708   0.000000   0.077220   0.582296   1.000000
   sample_5   1.000000   0.388522   0.000000   0.223085   0.944714
   sample_4   0.000000   0.131567   0.489785   0.748195   0.925549
   sample_7   0.923793   0.612186   0.066448   0.238219   0.000000,
             survival  immune
   sample_8         1       0
   sample_3         0       0
   sample_5         0       1
   sample_4         0       0
   sample_7         0       1)}}

期望输出

pd.DataFrame({'Overall_Survival': {'sample_8': 1,
  'sample_3': 0,
  'sample_5': 0,
  'sample_4': 0,
  'sample_7': 0},
 'Immune_Response': {'sample_8': 0,
  'sample_3': 0,
  'sample_5': 1,
  'sample_4': 0,
  'sample_7': 1}})

问题原因

原代码的核心问题是:train_data_dict中每个内层字典的值(如transcriptomics_df)不是单个DataFrame,而是包含两个DataFrame的元组(第一个是特征数据,第二个是标签数据)。isinstance(inner_value, pd.DataFrame)判断为False,导致后续筛选逻辑完全没执行,最终返回空字典。

修正方案

1. 先识别所有二元标签列

遍历元组中的每个元素,检查是否为DataFrame,再筛选唯一值数量为2的列:

import pandas as pd

y_label_encoded_columns = {}
for outer_key, inner_dict in train_data_dict.items():
    for inner_key, tuple_data in inner_dict.items():
        # 遍历元组里的每个DataFrame
        for idx, df in enumerate(tuple_data):
            if isinstance(df, pd.DataFrame):
                # 筛选唯一值数量为2的列
                label_cols = df.columns[df.nunique() == 2]
                if len(label_cols) > 0:
                    y_label_encoded_columns[(outer_key, inner_key, idx)] = label_cols

2. 整合为期望的输出格式

从任意一个标签DataFrame中提取survival和immune列,重命名后组合:

# 取第一个标签DataFrame(比如transcriptomics下的第二个元素)
label_df = train_data_dict['transcriptomics']['transcriptomics_df'][1]
final_df = pd.DataFrame({
    'Overall_Survival': label_df['survival'],
    'Immune_Response': label_df['immune']
})

print(final_df)
最终输出
pd.DataFrame({'Overall_Survival': {'sample_8': 1,
  'sample_3': 0,
  'sample_5': 0,
  'sample_4': 0,
  'sample_7': 0},
 'Immune_Response': {'sample_8': 0,
  'sample_3': 0,
  'sample_5': 1,
  'sample_4': 0,
  'sample_7': 1}})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:52:33