Спасибо @ W-B за то, что поставили меня на правильные позиции. Вот более общий ответ, который подходит для> 2 столбцов и где значения не связаны между столбцами.
import pandas as pd
import networkx as nx
from itertools import chain, combinations
columns = ['A','B','C']
df = pd.DataFrame([[1,1,1],[2,2,2],[2,3,3],[2,4,4],[3,3,4],[4,5,5]], columns = columns)
# make columns unique, so that values in any column are not treated as equivalent to values in another
# if you don't want to overwrite values, create new columns instead
for col in df.columns:
df[col] = str(col)+df[col].astype(str)
colPairs = list(combinations(columns, 2)) # we could match on a subset of column pairs instead
G = nx.compose_all([nx.from_pandas_edgelist(df, colPair[0], colPair[1]) for colPair in colPairs])
l=list(nx.connected_components(G))
l=[dict.fromkeys(y,x)for x,y in enumerate(l)]
d=dict(chain(*map(dict.items,l)))
df['ID']=df.B.map(d)
print(df)
A B C ID
0 A1 B1 C1 0
1 A2 B2 C2 1
2 A2 B3 C3 1
3 A2 B4 C4 1
4 A3 B3 C4 1
5 A4 B5 C5 2