Svalf Svalf - 4 months ago 19
Python Question

Python pandas DataFrame - Keep rows that have same information in 3 columns

If have a python DataFrame that looks like this:

ID_1 ID_2 haplotypeID locus
A1 A1 hap.1.1 KIRa
A1 A1 hap.1.2 KIRa
A2 A2 hap.2.1 KIRa
A2 A2 hap.2.2 KIRa
A3 A3 hap.1.1 KIRa
A4 A4 hap.2.2 KIRa
A4 A4 hap.1.2 KIRa
A1 A1 hap.1.1 KIRb
A2 A2 hap.2.1 KIRb
A2 A2 hap.2.2 KIRb
A3 A3 hap.1.1 KIRb
A3 A3 hap.1.2 KIRb
A4 A4 hap.2.2 KIRb
A4 A4 hap.1.2 KIRb
A1 A1 hap.1.1 KIRc
A2 A2 hap.2.1 KIRc
A3 A3 hap.1.1 KIRc
A3 A3 hap.1.2 KIRc
A4 A4 hap.1.2 KIRc


There are 4 columns named: ID_1, ID_2, haplotype ID and locus.
I would like to keep only the pairs of rows that are duplicated for the 3 columns ID_1, ID_2, and locus. In the example above, the output would thereby look like this:

ID_1 ID_2 haplotypeID locus
A1 A1 hap.1.1 KIRa
A1 A1 hap.1.2 KIRa
A2 A2 hap.2.1 KIRa
A2 A2 hap.2.2 KIRa
A4 A4 hap.2.2 KIRa
A4 A4 hap.1.2 KIRa
A2 A2 hap.2.1 KIRb
A2 A2 hap.2.2 KIRb
A3 A3 hap.1.1 KIRb
A3 A3 hap.1.2 KIRb
A4 A4 hap.2.2 KIRb
A4 A4 hap.1.2 KIRb
A3 A3 hap.1.1 KIRc
A3 A3 hap.1.2 KIRc


I hope someone can help me. Thank you in advance!

Answer

Try this:

df[df[['ID_1', 'ID_2', 'locus']].duplicated(keep=False)]
Out[449]: 
   ID_1 ID_2 haplotypeID locus
0    A1   A1     hap.1.1  KIRa
1    A1   A1     hap.1.2  KIRa
2    A2   A2     hap.2.1  KIRa
3    A2   A2     hap.2.2  KIRa
5    A4   A4     hap.2.2  KIRa
6    A4   A4     hap.1.2  KIRa
8    A2   A2     hap.2.1  KIRb
9    A2   A2     hap.2.2  KIRb
10   A3   A3     hap.1.1  KIRb
11   A3   A3     hap.1.2  KIRb
12   A4   A4     hap.2.2  KIRb
13   A4   A4     hap.1.2  KIRb
16   A3   A3     hap.1.1  KIRc
17   A3   A3     hap.1.2  KIRc

Or,

df[df.duplicated(['ID_1', 'ID_2', 'locus'], keep=False)]

df.duplicated(['ID_1', 'ID_2', 'locus']) or df[['ID_1', 'ID_2', 'locus']].duplicated() returns a boolean array. Corresponding elements are True for the duplicated entries (by default, only the first ones). By passing keep=False you can make all duplicated to have True values. The rest is boolean indexing.