将多列中的匹配对组合在一起 Python
Group together matched pairs across multiple columns Python
感谢您的阅读。
我有一个如下所示的数据框:
Col_A Col_B Col_C Col_D Col_E
1 2 null null null
1 null 3 null null
null 2 3 null null
null 2 null 4 null
1 null null null 5
每一行由两个 ID 之间的匹配组成(例如,来自 Col_A 的 ID1 匹配第一行来自 Col_B 的 ID2)。
在上面的例子中,所有5个ID都被连接(1连接2、2连接3、2连接4、1连接5)。因此,我想创建一个新列,将所有这些行聚集在一起,以便我可以轻松访问每组匹配对:
Col_A Col_B Col_C Col_D Col_E Group ID
1 2 null null null 1
1 null 3 null null 1
null 2 3 null null 1
null 2 null 4 null 1
1 null null null 5 1
我还没有找到类似的问题,但如果这是重复的,我深表歉意。非常感谢您的任何建议。
正如@YOBEN_S 和@QuangHoang 所建议的那样,您可以像这样使用 networkx 库和 Graph Theory connnected components。
给定 df,
df = pd.DataFrame({'Col_A': {0: 1.0, 1: 1.0, 2: np.nan, 3: np.nan, 4: 1.0, 5: np.nan},
'Col_B': {0: 2.0, 1: np.nan, 2: 2.0, 3: 2.0, 4: np.nan, 5: np.nan},
'Col_C': {0: np.nan, 1: 3.0, 2: 3.0, 3: np.nan, 4: np.nan, 5: np.nan},
'Col_D': {0: np.nan, 1: np.nan, 2: np.nan, 3: 4.0, 4: np.nan, 5: np.nan},
'Col_E': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: 5.0, 5: np.nan},
'Col_F': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: 6.0},
'Col_G': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: 7.0}})
| | Col_A | Col_B | Col_C | Col_D | Col_E | Col_F | Col_G |
|---:|--------:|--------:|--------:|--------:|--------:|--------:|--------:|
| 0 | 1 | 2 | nan | nan | nan | nan | nan |
| 1 | 1 | nan | 3 | nan | nan | nan | nan |
| 2 | nan | 2 | 3 | nan | nan | nan | nan |
| 3 | nan | 2 | nan | 4 | nan | nan | nan |
| 4 | 1 | nan | nan | nan | 5 | nan | nan |
| 5 | nan | nan | nan | nan | nan | 6 | 7 |
使用
import networkx as nx
d_edge = df.apply(lambda x: x.dropna().to_numpy(), axis=1)
G = nx.from_edgelist(d_edge.to_numpy().tolist())
cc_list = list(nx.connected_components(G))
df['groupid'] = d_edge.apply(lambda x: [n for n, i in enumerate(cc_list) if x[0] in i][0] + 1)
df
输出:
| | Col_A | Col_B | Col_C | Col_D | Col_E | Col_F | Col_G | groupid |
|---:|--------:|--------:|--------:|--------:|--------:|--------:|--------:|----------:|
| 0 | 1 | 2 | nan | nan | nan | nan | nan | 1 |
| 1 | 1 | nan | 3 | nan | nan | nan | nan | 1 |
| 2 | nan | 2 | 3 | nan | nan | nan | nan | 1 |
| 3 | nan | 2 | nan | 4 | nan | nan | nan | 1 |
| 4 | 1 | nan | nan | nan | 5 | nan | nan | 1 |
| 5 | nan | nan | nan | nan | nan | 6 | 7 | 2 |
感谢您的阅读。
我有一个如下所示的数据框:
Col_A Col_B Col_C Col_D Col_E
1 2 null null null
1 null 3 null null
null 2 3 null null
null 2 null 4 null
1 null null null 5
每一行由两个 ID 之间的匹配组成(例如,来自 Col_A 的 ID1 匹配第一行来自 Col_B 的 ID2)。
在上面的例子中,所有5个ID都被连接(1连接2、2连接3、2连接4、1连接5)。因此,我想创建一个新列,将所有这些行聚集在一起,以便我可以轻松访问每组匹配对:
Col_A Col_B Col_C Col_D Col_E Group ID
1 2 null null null 1
1 null 3 null null 1
null 2 3 null null 1
null 2 null 4 null 1
1 null null null 5 1
我还没有找到类似的问题,但如果这是重复的,我深表歉意。非常感谢您的任何建议。
正如@YOBEN_S 和@QuangHoang 所建议的那样,您可以像这样使用 networkx 库和 Graph Theory connnected components。
给定 df,
df = pd.DataFrame({'Col_A': {0: 1.0, 1: 1.0, 2: np.nan, 3: np.nan, 4: 1.0, 5: np.nan},
'Col_B': {0: 2.0, 1: np.nan, 2: 2.0, 3: 2.0, 4: np.nan, 5: np.nan},
'Col_C': {0: np.nan, 1: 3.0, 2: 3.0, 3: np.nan, 4: np.nan, 5: np.nan},
'Col_D': {0: np.nan, 1: np.nan, 2: np.nan, 3: 4.0, 4: np.nan, 5: np.nan},
'Col_E': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: 5.0, 5: np.nan},
'Col_F': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: 6.0},
'Col_G': {0: np.nan, 1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: 7.0}})
| | Col_A | Col_B | Col_C | Col_D | Col_E | Col_F | Col_G |
|---:|--------:|--------:|--------:|--------:|--------:|--------:|--------:|
| 0 | 1 | 2 | nan | nan | nan | nan | nan |
| 1 | 1 | nan | 3 | nan | nan | nan | nan |
| 2 | nan | 2 | 3 | nan | nan | nan | nan |
| 3 | nan | 2 | nan | 4 | nan | nan | nan |
| 4 | 1 | nan | nan | nan | 5 | nan | nan |
| 5 | nan | nan | nan | nan | nan | 6 | 7 |
使用
import networkx as nx
d_edge = df.apply(lambda x: x.dropna().to_numpy(), axis=1)
G = nx.from_edgelist(d_edge.to_numpy().tolist())
cc_list = list(nx.connected_components(G))
df['groupid'] = d_edge.apply(lambda x: [n for n, i in enumerate(cc_list) if x[0] in i][0] + 1)
df
输出:
| | Col_A | Col_B | Col_C | Col_D | Col_E | Col_F | Col_G | groupid |
|---:|--------:|--------:|--------:|--------:|--------:|--------:|--------:|----------:|
| 0 | 1 | 2 | nan | nan | nan | nan | nan | 1 |
| 1 | 1 | nan | 3 | nan | nan | nan | nan | 1 |
| 2 | nan | 2 | 3 | nan | nan | nan | nan | 1 |
| 3 | nan | 2 | nan | 4 | nan | nan | nan | 1 |
| 4 | 1 | nan | nan | nan | 5 | nan | nan | 1 |
| 5 | nan | nan | nan | nan | nan | 6 | 7 | 2 |