Pandas通过比较列A1和A2来筛选行

mnemlml8  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(171)

CHR|SNP|BP|A1|A2|OR|P
-|
8|rs62513865|101592213|T|C|1.00652|0.8086
8|rs79643588|106973048|A|T|1.01786|0.4606

我有这个表示例,我想通过比较列A1和A2来筛选行。
如果出现这四种情况,请删除该行

A1|A2

A|T
T|A
C|G
G|C

(例如,第一个表中的第2行)。
我如何使用pythonPandas做到这一点?

ekqde3dh

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
svdrlsy4

svdrlsy42#

保留

假设df1df2,您只需使用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(需要唯一索引):

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]

相关问题