# Find symmetric pairs quickly in numpy

One way is using `np.unique`

with `return_index=True`

and use the result to index the dataframe:

```
a = np.sort(df.values)
_, ix = np.unique(a, return_index=True, axis=0)
print(df.iloc[ix, :])
c1 c2
0 0 0
1 0 1
20 2 0
3 0 3
40 4 0
50 5 0
6 0 6
70 7 0
8 0 8
9 0 9
11 1 1
21 2 1
13 1 3
41 4 1
51 5 1
16 1 6
71 7 1
...
```

You can sort the values, then `groupby`

:

```
a= np.sort(df.to_numpy(), axis=1)
df.groupby([a[:,0], a[:,1]], as_index=False, sort=False).first()
```

**Option 2**: If you have a lot of pairs `c1, c2`

, `groupby`

can be slow. In that case, we can assign new values and filter by `drop_duplicates`

:

```
a= np.sort(df.to_numpy(), axis=1)
(df.assign(one=a[:,0], two=a[:,1]) # one and two can be changed
.drop_duplicates(['one','two']) # taken from above
.reindex(df.columns, axis=1)
)
```

`frozenset`

```
mask = pd.Series(map(frozenset, zip(df.c1, df.c2))).duplicated()
df[~mask]
```