计算 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”
我有一个专利号和发明这些专利的发明人的数据框。例如:
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”