2013-11-25 29 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检查所有记录。如果您给出期望的输出,我可以更具体。