我正在尝试使用以下形式的数据帧执行任务(在生物信息学中,TCGA数据):
df = pd.DataFrame({'ID':['TCGA-AB-0001','TCGA-AB-0001','TCGA-AB-0001','TCGA-AB-0001','TCGA-AB-0002','TCGA-AB-0002','TCGA-AB-0002','TCGA-AB-0002','TCGA-AB-0003','TCGA-AB-0002'],
'Reference':['HG19','HG18','HG19','GRCh37','HG18','HG19','GRCh37','HG19','GRCh37','GRCh37'],
'SampleType':['Tumor','Tumor','Normal','Normal','Tumor','Normal','Normal','Tumor','Tumor','Tumor']
})
看起来像:
^{pr2}$如果行对具有相同的“Reference”和不同的“SampleType”,我将尝试对它们进行匹配。结果将生成以下形式的新数据帧:
TUMOR NORMAL
index ID Reference SampleType index ID Reference SampleType
0 TCGA-AB-0001 HG19 Tumor 2 TCGA-AB-0001 HG19 Normal
7 TCGA-AB-0002 HG19 Tumor 5 TCGA-AB-0002 HG19 Tumor
9 TCGA-AB-0002 GRCh37 Tumor 6 TCGA-AB-0002 GRCh37 Normal
现在,我想删除重复的ID,但这样做的优先级是根据列表[GRCh37,HG19,HG18]。例如,如果HG19和HG18都存在相同的ID,我将保留HG19。结果如下:
TUMOR NORMAL
index ID Reference SampleType index ID Reference SampleType
0 TCGA-AB-0001 HG19 Tumor 2 TCGA-AB-0001 HG19 Normal
9 TCGA-AB-0002 GRCh37 Tumor 6 TCGA-AB-0002 GRCh37 Normal
有没有一种方法可以通过groupby或其他pandas函数来实现呢?在
谢谢!在
对我来说,想要的输出是什么仍然不是百分之百清楚的。但根据我的理解,这似乎起到了作用。在
这比原始示例和具有冗余候选行的测试稍长。在
^{pr2}$现在我们创建一个可能有“冗余”行的临时数据框。在
如果我理解正确,我们只想为每个ID保留一行,按照
priority = ['GRCh37', 'HG19', 'HG18']
的顺序选择它们这就产生了我对最终期望输出的理解。注意:这与原始示例不同,因为我在输入df中展开了。在
为了创建新的数据帧,您可以使用pandas条件切片:(在您的问题中,您在索引5行的数据框})
NORMAL
上犯了一个错误,SampleType
应该是Normal
而不是{或者,如果你有机会拥有
^{pr2}$'normal'
和'tumor'
之外的任何东西,你不想得到除了'normal'
之外的所有东西:然后,为了删除重复项并保留特定值,可以创建另一列,该列保留相同的信息,但由整数组成(比字符串列表更容易排序):
当然,可以在拆分数据帧df之前执行此操作(然后只对一个数据帧执行此操作,而不是对两个数据帧执行此操作)。填写此栏:
然后按此新列排序,删除重复项,只保留第一行:
为了得到预期的输出,删除临时列,然后按索引进行处理:
输出:
相关问题 更多 >
编程相关推荐