2013-11-25 54 views
0

我有一個數據幀pandas看起來像如何測量熊貓羣組中對象的重疊?

example_df = pd.DataFrame({"class": ["A", "A", "A", "B", "B", "B"], "id": [1,2,3,4,5,6], "value": [100, 100, 101, 101, 102, 103]}) 

example_df 
    class id value 
0  A 1 100 
1  A 2 100 
2  A 3 101 
3  B 4 101 
4  B 5 102 
5  B 6 103 

我想知道,每個class A或B,怎樣獨特的value s爲;也就是說,它與另一個類共享多少個值。 (您可以假設只有兩個類。)例如,給定上面的數據框,A與B共享一個值。

通過將列拆分爲sets並手動計算交點來完成此操作並不困難,但這不是很好。在熊貓中有沒有一種優雅的方式呢?

回答

0

我覺得一套計算是OK,你可以使用numpy.intersect1d()

import numpy as np 
g = example_df.groupby("class") 
a = g.get_group("A") 
b = g.get_group("B") 
np.intersect1d(a.value, b.value) 

這裏是另一種方法是groupby價值,這看起來不錯,但我覺得它慢於 intersect1d版本:

(example_df.groupby("value")["class"].nunique() > 1).sum() 
0

如果查詢是這樣的:

>>> example_df[['class', 'value']].drop_duplicates().groupby('value').size() 
value 
100  1 
101  2 
102  1 
103  1 

然後您可以使用2檢查所有記錄。如果您給出期望的輸出,我可以更具體。