对于存储在 SampleGroup/SampleID 数据库中的给定样本,我有一个 DataFrame 将一个或多个标签与样本组和 id 配对:
有大约 100 个标签。我想创建二进制模型来对每个标签进行分类,然后并行运行这些模型来进行多类分类。为了存储这些模型,我正在创建一个表单字典
{label_1:[df_1, model_object_1],
label_2:[df_2, model_object_2],
...,
label_n:[df_n, model_object_n]
}
其中每个 df 是上述形式的 DataFrame,除了 'Labels' 列的值被替换为 1 或 0,这取决于字典键 'label_i' 是否在该行的原始标签列表中。这是(应该)这样做的代码,这给我带来了一些麻烦:
models = dict.fromkeys(target_labels, [])
for label in target_labels:
label_list = []
for multi_label_list in df['Labels']:
if label in multi_label_list:
label_list.append(1)
else:
label_list.append(0)
data = {
'SampleGroup':df['SampleGroup'].copy(),
'SampleID':df['SampleID'].copy(),
'Labels':label_list
}
models[label].append(pd.DataFrame(data=data, index=df.index))
print(len(models[label]))
当我运行它时,为标签创建的每个新二进制 label_list 都会附加到字典中的每个模型,就好像我正在创建对同一个 label_list 的引用(类似于 df2 = df 如何创建对 df 的引用,而不是副本)。上面代码的输出清楚地说明了这个故事:
[
我设法通过将每个新 DataFrame 分配给键而不是将其附加到键的值列表来解决此问题:
models[label] = (pd.DataFrame(data=data, index=df.index))
我调用 DataFrames(或者可能是原生 Python)的什么属性会导致它正常工作,但附加到一个列表以产生奇怪的行为?