簡體   English   中英

在Pandas中,如何根據其他列的公共相互關系創建唯一ID?

[英]In Pandas, how to create a unique ID based on the common interrelation of other columns?

我有一個帶有兩個 ID 列的 dataframe。 我需要使用以下條件設置一個唯一的公共關聯 ID:如果 ID1 或 ID2 有一些共同點,則它們必須具有相同的 common_ID (ID_3)。

dataframe 看起來像:

df = pd.DataFrame({'ID_1': ['111', '111', '222', '333', '333', '444', '555', '666', '666', '777'],
               'ID_2': ['AAA', 'BBB', 'AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'DDD', 'FFF', 'CCC']})

所需的 output 應如下所示:

ID_1 ID_2 ID_3
111 AAA 1
111 BBB 1
222 AAA 1
333 BBB 1
333 CCC 1
444 DDD 2
555 電子電氣設備 3
666 DDD 2
666 FFF 2
777 CCC 1
df_output = pd.DataFrame({'ID_1': ['111', '111', '222', '333', '333', '444', '555', '666', '666', '777'],
                      'ID_2': ['AAA', 'BBB', 'AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'DDD', 'FFF', 'CCC'],
                      'ID_3': ['1', '1', '1', '1', '1', '2', '3', '2', '2', '1']})

澄清條件

在第 1 行和第 2 行 ID_1 相同,因此它們必須具有相同的 ID_3。

第 3 行的 ID_2 與第 1 行相同,因此其 ID_3 必須與 1st row = 1 相同。

第 4 行與第 2 行具有相同的 ID_2,這就是為什么必須將其設置為與 2nd = 1 相同的 ID_3。

第 5 行的 ID_1 與第 4 行相同,因此 ID_3 = 1。

第 6 行此時有 ID_1 和 ID_2 的唯一組合,因此標記為 ID_3 = 2。

比第 7 行 = 3。

但是 8th 和 6th 有相同的 ID_2,所以 ID_3 = 2。

等等

我認為我們可以使用networkx來解決這個問題:

import networkx as nx

G=nx.Graph()
G.add_edges_from(df[['ID_1','ID_2']].to_numpy().tolist())
cc = list(nx.connected_components(G))
L=[dict.fromkeys(b,a) for a, b in enumerate(cc,1)]
d={k: v for d in L for k, v in d.items()}
out = df.assign(ID_3=df['ID_2'].map(d))

print(out)

  ID_1 ID_2  ID_3
0  111  AAA     1
1  111  BBB     1
2  222  AAA     1
3  333  BBB     1
4  333  CCC     1
5  444  DDD     2
6  555  EEE     3
7  666  DDD     2
8  666  FFF     2
9  777  CCC     1

要查看連接的組件:

print(cc)
[{'111', '777', '222', 'AAA', '333', 'BBB', 'CCC'}, 
 {'DDD', 'FFF', '666', '444'}, {'555', 'EEE'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM