优化pandas过滤器内部应用功能

时间:2015-04-03 21:52:45

标签: python pandas

我有一个对的列表 - 存储在一个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万对),它会非常缓慢。有什么建议我怎么能更快地做到这一点?

1 个答案:

答案 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]