Pandas -查找在每个类组中显示的唯一值

bgtovc5b  于 2023-04-04  发布在  其他
关注(0)|答案(4)|浏览(114)

我有一个python pandas表如下:

class  |     id
_____________________
  A      12311894945
  A      12311760566
  A      12311433981
  A      12299990440       
  A      12291758744
  B      12311894945
  B      12311760566
  B      12311433981
  B      12299990440       
  B      12291758744
  C      12299990440       
  C      12291758744

我想得到属于每个类组的唯一id值,这样预期的结果如下所示:

[12299990440, 12291758744]

我在想,也许是一个groupby class和某种交集,但我看不出这两个操作是如何在Pandas中一起完成的。

c86crjj0

c86crjj01#

试试看:

uniques = df.groupby('id')['class'].nunique()

uniques[uniques.eq(df['class'].nunique()) ].index

输出:

Int64Index([12291758744, 12299990440], dtype='int64', name='id')
lyfkaqu1

lyfkaqu12#

使用集合交集和reduce

from functools import reduce

unique_by_group = df.groupby("class")["id"].apply(set)
reduce(lambda x, y: x & y, unique_by_group)

>>> {12291758744, 12299990440}
umuewwlo

umuewwlo3#

另一种使用透视的方法:

s = pd.crosstab(df['id'],df['class']).astype(bool).all(1)
#s = df.pivot_table(index='id',columns='class',aggfunc=len).ge(1).all(1)
s[s].index
#Int64Index([12291758744, 12299990440], dtype='int64', name='id')
iq0todco

iq0todco4#

这里是另一个选项:

uniques = df.groupby(['id','class']).size().unstack().fillna(0).astype(bool).all(axis=1)
uniques.loc[uniques].index.tolist()

或:

uniques = df.groupby('id')['class'].agg(set).eq(set(df['class']))
uniques.loc[uniques].index.tolist()

或:

list(set.intersection(*df.groupby('class')['id'].agg(set)))

相关问题