我的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
是多么独特;也就是说,它与另一个类共享多少个值。 (您可以假设只有两个类。)例如,给定上面的数据帧,A与B
共享一个值。
通过将列分成set
并手动计算交叉点来做到这一点并不难,但这并不是很好。在熊猫中有优雅的方式吗?
答案 0 :(得分:0)
我认为集合计算没问题,您可以使用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()
答案 1 :(得分:0)
如果你这样查询:
>>> example_df[['class', 'value']].drop_duplicates().groupby('value').size()
value
100 1
101 2
102 1
103 1
然后,您可以使用2
检查所有记录。如果你提供所需的输出,我可能会更具体。