唯一對,所以這個數據幀返回行:跨越我試圖找到具有橫跨兩列值的唯一對行列
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
如果只有一個每對如果列翻轉作爲鏡像值的發生。
唯一對,所以這個數據幀返回行:跨越我試圖找到具有橫跨兩列值的唯一對行列
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
如果只有一個每對如果列翻轉作爲鏡像值的發生。
我認爲你可以使用apply
sorted
+ 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.min
和DataFrame.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
加載數據:
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")
幹得漂亮。良好的使用排序和drop_duplicates! – Allen
@Allen - 謝謝。 – jezrael