嵌套字典中识别二元/标签编码列失败:代码返回空字典求助
问题:识别嵌套字典中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
相关产品推荐
相关产品推荐

