减少 pandas 数据框中的 id 组合

Reducing id combinations in pandas dataframe

我有一个 pandas 数据框,它包含两个 id 列的组合,例如:

ID1 ID2
A B
A C
A D
A E
B C
B D
B E
C D
C E
D E
F H
I K
K J
G F
G H
I J

这里我们有 ABCD、FGH、IJK 的 2 种组合选择。

我只想保留特定集合中具有最多 ID1 的值的行。对于 ABCD 这将是 A,对于 FGH 这将是 G,对于 IJK 这将是 I。结果如下:

ID1 ID2
A B
A C
A D
A E
I K
G F
G H
I J

计算ID1中未求值的个数,然后在list comprehension中对每个集合计算最大值的索引,最后使用这些索引过滤dataframe中的行

c = df['ID1'].value_counts()
i = [c.reindex([*s]).idxmax() for s in ['ABCB', 'FGH', 'IJK']]

df[df['ID1'].isin(i)]

   ID1 ID2
0    A   B
1    A   C
2    A   D
3    A   E
11   I   K
13   G   F
14   G   H
15   I   J

假设您事先不知道这些组,这可以使用 networkx.

作为图形问题来解决

你有下图:

你需要的是找到每个簇的根(找到根的方法见here)。

import networkx as nx

G = nx.from_pandas_edgelist(df, source='ID1', target='ID2',
                            create_using=nx.DiGraph)

roots = [n for n,d in G.in_degree() if d==0] 

df2 = df[df['ID1'].isin(roots)]

输出:

   ID1 ID2
0    A   B
1    A   C
2    A   D
3    A   E
11   I   K
13   G   F
14   G   H
15   I   J