我有一个对的列表 - 存储在一个DataFrame中 - 每对都有一个' a'专栏和' b'柱。对于每一对,我想要返回具有相同' a'的' b。例如,给定以下一组对:
a b
0 c d
1 e f
2 c g
3 e h
4 i j
5 e k
我想最终:
a b equivalents
0 c d [g]
1 e f [h, k]
2 c g [d]
3 e h [f, k]
4 i j []
5 e k [h, e]
我可以使用以下方法执行此操作:
def equivalents(x):
l = pairs[pairs["a"] == x["a"]]["b"].tolist()
return l[1:] if l else l
pairs["equivalents"] = pairs.apply(equivalents, axis = 1)
但是在较大的套装上(例如100万对),它会非常缓慢。有什么建议我怎么能更快地做到这一点?
答案 0 :(得分:2)
我认为这应该快一点。首先,只需添加它们。
df['equiv'] = df.groupby('a')['b'].transform(sum)
a b equiv
0 c d dg
1 e f fhk
2 c g dg
3 e h fhk
4 i j j
5 e k fhk
现在转换为列表并删除列中的任何字母' b'。
df.apply( lambda x: [ y for y in list( x.equiv ) if y != x.b ], axis=1 )
0 [g]
1 [h, k]
2 [d]
3 [f, k]
4 []
5 [f, h]