计算 pandas 数据框中的唯一组

Count unique groups within a pandas data frame

我有一个专利号和发明这些专利的发明人的数据框。例如:

patent_number inventor_id
1 A
1 B
2 B
2 C
3 A
3 B

我将团队定义为一起产生专利的一群发明家。例如。团队 (A,B) 产生了专利 1,(B,C) 产生了专利 2,然后 (A,B) 产生了专利 3。我想计算独特团队的数量。在这种情况下,答案是 2.

使用 python 计算唯一团队数量的最快方法是什么?

我已经编写了这段代码,但是当我 运行 在我的整个数据集上使用它时它非常慢,其中包括超过 600 万个专利号和 350 万个唯一发明人 ID。

teams = []

for pat_id, pat_df in inventor_data.groupby("patent_number"):

    if list(pat_df["inventor_id"]) not in teams:
    
        teams.append(list(pat_df["inventor_id"]))

print("Number of teams ", len(teams))

我正在寻求速度改进。如果你能帮助我理解它们速度更快的原因,我总是很想了解这一点。

谢谢!

您可以 groupby 聚合为 frozenset 并计算唯一值:

df.groupby('patent_number')['inventor_id'].agg(frozenset).nunique()

输出:2

有趣的是,你还可以通过value_counts:

轻松得到每支队伍的出现次数
df.groupby('patent_number')['inventor_id'].agg(frozenset). value_counts()

输出:

(B, A)    2
(B, C)    1
Name: inventor_id, dtype: int64

你可以选择:

   inventor_data = inventor_data.sort_values("inventor_id")
   inventor_data.groupby("patent_number").inventor_id.sum().nunique()

几点说明:

  • 必须对值进行排序以避免对称,并将 (A,B) 和 (B,A) 视为一个团队。
  • 您可以将字符串“A”和“B”相加,生成代表团队 (A, B) 的字符串“AB”