减少 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
我有一个 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