我有一个名为transcripts
的数据框和一个名为genes
的numpy数组。 genes
只是geneID
的transcripts
列的唯一值。对于genes
的每个值,我想找到最长的成绩单(transcriptLength
中的列transcripts
),并从transcripts
数据框中删除所有其他记录。我以为我会使用下面的代码,然后遍历genes
。
#subset transcripts, leaving only rows with id of genes[20000]
x=transcripts.loc[(transcripts['geneID'] == genes[20000])].copy()
#Find longest transcript
y = x.transcriptLength.max()
#subset transcripts df to remove all transcripts that are shorter for that gene
z=transcripts.loc[(transcripts['geneID'] != genes[20000]) & (transcripts['transcriptLength'] != y)].copy()
但是,由于某些原因,此代码将删除所有带有该
geneID
的成绩单。我以前像这样子集化(并查看过其他类似的堆栈问题),并且我的代码似乎是正确的,所以我无法理解问题是什么。这里缺少什么吗?FYI
geneID
列是字符串,而transcriptLength
列是整数。这是
transcripts
的第一行:geneID transcriptID transcriptLength
0 ENSPTRG00000042638 ENSPTRT00000076395 71
1 ENSPTRG00000042646 ENSPTRT00000076407 949
2 ENSPTRG00000042654 ENSPTRT00000076381 69
3 ENSPTRG00000042645 ENSPTRT00000076409 1558
4 ENSPTRG00000042644 ENSPTRT00000076406 75
编辑:这是一个玩具示例,我们试图在其中找到基因g2的最长转录本,并删除所有较短的转录本:
#Create dataframe (akin to transcripts above)
d = {'transcriptID' : pd.Series(['t1', 't2', 't3', 't4'], index=['a', 'b', 'c', 'd']),
'geneID' : pd.Series(['g1', 'g2', 'g3', 'g2'], index=['a', 'b', 'c', 'd']),
'transcriptLength' : pd.Series([212, 715, 213, 984], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
#Subset df to include only values where geneID = g2
x=df.loc[(df['geneID'] == 'g2')].copy()
#Find max transcriptLength
y = x.transcriptLength.max()
#Subset main df to remove all g2 values except the maximum one
z=df.loc[(df['geneID'] != 'g2') & (df['transcriptLength'] != y)].copy()
输出:
geneID transcriptID transcriptLength
a g1 t1 212
c g3 t3 213
它已删除所有
geneID
为g2
的行。仅应删除行b
(在所有g2
GeneID中值最低的行)。行d
也已被删除,这是不正确的。 最佳答案
您需要z=df.loc[(df['geneID'] != 'g2') | (df['transcriptLength'] == y)].copy()
,即您想要'or'而不是'and'。因此,保留g2之外的任何内容,如果保留在g2中,则希望它不具有transcriptLength y。按照目前的说法,除非所有内容都不在g2中并且没有该transcriptLength,否则您将拒绝任何内容。
关于python - Pandas :解析有两个条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48170811/