CHR|SNP|BP|A1|A2|OR|P-|8|rs62513865|101592213|T|C|1.00652|0.80868|rs79643588|106973048|A|T|1.01786|0.4606
我有这个表示例,我想通过比较列A1和A2来筛选行。如果出现这四种情况,请删除该行
A1|A2
A|TT|AC|GG|C
(例如,第一个表中的第2行)。我如何使用pythonPandas做到这一点?
ekqde3dh1#
有一种方法可以做到这一点为两个DF中的每一个组合这两列。在第二个df的情况下将其作为列表,并在第二个df中搜索第一个组合
df[~(df['A1']+df['A2']).str.strip() .isin(df2['A1']+df2['A2'].tolist())]
CHR SNP BP A1 A2 OR P 0 8 rs62513865 101592213 T C 1.00652 0.8086
svdrlsy42#
假设df1和df2,您只需使用merge即可保留常用值:
df1
df2
merge
out = df1.merge(df2)
输出:
CHR SNP BP A1 A2 OR P 0 8 rs79643588 106973048 A T 1.01786 0.4606
要删除行,请执行负合并:
out = (df1.merge(df2, how='outer', indicator=True) .loc[lambda d: d.pop('_merge').eq('left_only')] )
或merge,并将其余索引获取为drop(需要唯一索引):
drop
out = df1.drop(df1.reset_index().merge(df2)['index'])
CHR SNP BP A1 A2 OR P 0 8.0 rs62513865 101592213.0 T C 1.00652 0.8086
由于您似乎有核苷酸,并且希望删除与A/T或G/C对不匹配的大小写,您可以将A1中的A转换为T,将C转换为G,并检查其值是否与A2的值不相同:
m = df1['A1'].map({'A': 'T', 'C': 'G'}).fillna(df1['A1']).ne(df1['A2']) out = df1[m]
2条答案
按热度按时间ekqde3dh1#
有一种方法可以做到这一点
为两个DF中的每一个组合这两列。在第二个df的情况下将其作为列表,并在第二个df中搜索第一个组合
svdrlsy42#
保留
假设
df1
和df2
,您只需使用merge
即可保留常用值:输出:
掉话
要删除行,请执行负合并:
或
merge
,并将其余索引获取为drop
(需要唯一索引):输出:
替代方案
由于您似乎有核苷酸,并且希望删除与A/T或G/C对不匹配的大小写,您可以将A1中的A转换为T,将C转换为G,并检查其值是否与A2的值不相同: