我有一个数据框,用于存储三个对象之间的距离:
df = pd.DataFrame({'obj1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
'obj2': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
'dist': [0, 1, 2, 1, 0, 3, 2, 3, 0]})
有没有一种方法可以计算除自身之外每个
obj1
具有最小距离的对象?对于上面的示例,返回 [('a', 'b', 1), ('b', 'a', 1), ('c', 'a', 2)]
。
import pandas as pd
df = pd.DataFrame({'obj1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
'obj2': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
'dist': [0, 1, 2, 1, 0, 3, 2, 3, 0]})
# obj1 obj2 dist
# 0 a a 0
# 1 a b 1
# 2 a c 2
# 3 b a 1
# 4 b b 0
# 5 b c 3
# 6 c a 2
# 7 c b 3
# 8 c c 0
df.loc[df.obj1!=df.obj2].sort_values(by="dist").drop_duplicates(subset="obj1", keep="first")
# obj1 obj2 dist
# 1 a b 1
# 3 b a 1
# 6 c a 2
query
),然后使用 groupby.idxmin
:
df.loc[df.query('obj1 != obj2').groupby('obj1')['dist'].idxmin()]
输出:
obj1 obj2 dist
1 a b 1
3 b a 1
6 c a 2