Pandas在python Pandas数据帧中获取两行之间交集的方法

时间:2016-07-27 17:18:15

标签: python numpy pandas dataframe

说我有一些如下所示的数据。我想得到同时有两个标签的id计数。

tag id
a A
b B
a B
b A
c A

我想要的结果是什么:

tag1 tag2 count
a b 2
a c 1
b c 1

在普通的python中,我可以编写伪代码:

d = defaultdict(set)
d[tag].add(id)
for tag1, tag2 in itertools.combinations(d.keys(), 2):
    print tag1, tag2, len(d[tag1] & d[tag2])

不是最有效的方式,但应该有效。现在我已经将数据存储在Pandas数据帧中了。是否有更多的熊猫方式来实现相同的结果?

1 个答案:

答案 0 :(得分:2)

这是我的尝试:

from itertools import combinations
import pandas as pd
import numpy as np

In [123]: df
Out[123]:
  tag id
0   a  A
1   b  B
2   a  B
3   b  A
4   c  A

In [124]: a = np.asarray(list(combinations(df.tag, 2)))

In [125]: a
Out[125]:
array([['a', 'b'],
       ['a', 'a'],
       ['a', 'b'],
       ['a', 'c'],
       ['b', 'a'],
       ['b', 'b'],
       ['b', 'c'],
       ['a', 'b'],
       ['a', 'c'],
       ['b', 'c']],
      dtype='<U1')

In [126]: a = a[a[:,0] != a[:,1]]

In [127]: a
Out[127]:
array([['a', 'b'],
       ['a', 'b'],
       ['a', 'c'],
       ['b', 'a'],
       ['b', 'c'],
       ['a', 'b'],
       ['a', 'c'],
       ['b', 'c']],
      dtype='<U1')

In [129]: np.ndarray.sort(a)

In [130]: pd.DataFrame(a).groupby([0,1]).size()
Out[130]:
0  1
a  b    4
   c    2
b  c    2
dtype: int64