2016-07-27 22 views
2

說我有一些如下所示的數據。我想要同時獲得有兩個標籤的ID數。熊貓在python熊貓數據框中的兩行之間獲得交集的方式

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數據框中。是否有更多熊貓的方式來達到同樣的效果?

+2

能否請您發表所需的輸出/數據集,因爲目前尚不清楚你想要達到的目標和你的代碼是不工作? – MaxU

+2

這條線是如何工作的? 'd [標籤] .append(ID)'?集沒有追加方法? – ayhan

+1

@MaxU嗨,更新的問題。這足夠清楚:) – dofine

回答

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 
+0

HI只是最後一步,值應該是它的一半? – dofine

+0

@dofine,是的,我現在看到它。這仍然有待完成。我爲您的問題添加了'numpy'標籤,這可能會吸引NumPy大師。我不認爲這個任務有一個漂亮,清晰,純粹的熊貓解決方案... – MaxU

+0

它必須涉及某種組合,所以至少這裏的想法是好的。 – Divakar