2017-05-25 64 views
1

唯一對,所以這個數據幀返回行:跨越我試圖找到具有橫跨兩列值的唯一對行列

A B 
1 0 
2 0 
3 0 
0 1 
2 1 
3 1 
0 2 
1 2 
3 2 
0 3 
1 3 
2 3 

將被減少到只有不匹配的行如果翻轉,例如1和3是一個組合,我只想返回一次。因此,如果列被翻轉(3和1),則可以刪除相同的對。我希望得到的表是:

A B 
0 2 
0 3 
1 0 
1 2 
1 3 
2 3 

如果只有一個每對如果列翻轉作爲鏡像值的發生。

回答

4

我認爲你可以使用applysorted + drop_duplicates

df = df.apply(sorted, axis=1).drop_duplicates() 
print (df) 
    A B 
0 0 1 
1 0 2 
2 0 3 
4 1 2 
5 1 3 
8 2 3 

更快的解決方案與numpy.sort

df = pd.DataFrame(np.sort(df.values, axis=1), index=df.index, columns=df.columns) 
     .drop_duplicates() 
print (df) 
    A B 
0 0 1 
1 0 2 
2 0 3 
4 1 2 
5 1 3 
8 2 3 

解決方案,而與DataFrame.minDataFrame.max排序:

a = df.min(axis=1) 
b = df.max(axis=1) 
df['A'] = a 
df['B'] = b 
df = df.drop_duplicates() 
print (df) 
    A B 
0 0 1 
1 0 2 
2 0 3 
4 1 2 
5 1 3 
8 2 3 
+0

幹得漂亮。良好的使用排序和drop_duplicates! – Allen

+0

@Allen - 謝謝。 – jezrael

1

加載數據:

import numpy as np 
import pandas as pd 

a = np.array("1 2 3 0 2 3 0 1 3 0 1 2".split("\t"),dtype=np.double) 
b = np.array("0 0 0 1 1 1 2 2 2 3 3 3".split("\t"),dtype=np.double) 
df = pd.DataFrame(dict(A=a,B=b)) 

如果你不需要整個DF排序:

df["trans"] = df.apply(
    lambda row: (min(row['A'], row['B']), max(row['A'], row['B'])), axis=1 
) 
df.drop_duplicates("trans")