首页 > 解决方案 > 自加入熊猫后如何获得两列之间的唯一关系?

问题描述

import pandas as pd

data={'x':['A','A','B','B','C','E','F'],
      'y':['B','C','A','C','D','F','G']}
df=pd.DataFrame(data)

print(df)

我有一个像这样的大数据框(用 ABC 简化):

     x    y
0    A    B
1    A    C
2    B    A
3    B    C
4    C    D
5    E    F
6    F    G

有像第 0 行:A <-> B 和第 2 行:B <-> A 这样的“循环”,这对我来说意味着相同的关系。

我想知道 x 和 y 列值之间的关系,并给它们一个唯一的新 id。

所以对于这个示例表,这意味着:

A = B = C = D 给它一个唯一的 id,即 90 E = F = G 给它一个唯一的 id,即 91

我需要的结果表应该是:

    id  value
0   90    A
1   90    B
2   90    C 
3   90    D
4   91    E
5   91    F
6   91    G

我怎样才能用熊猫做到这一点?帮助将不胜感激!

标签: pythonpandasuniquenetworkxrelation

解决方案


这似乎是一个图表,即networkx库,问题。让我们在图网络中寻找连接组件中的节点(请参阅此 wiki 页面)

import pandas as pd
import networkx as nx

data={'x':['A','A','B','B','C','E','F'],
      'y':['B','C','A','C','D','F','G']}
df=pd.DataFrame(data)
G = nx.from_pandas_edgelist(df, 'x','y')
g = nx.connected_components(G)
S = pd.Series()
for i,n in enumerate(g):
    s = pd.Series(sorted(list(n)), index=[i]*len(n))
    S = pd.concat([S, s])

S

输出:

0    A
0    B
0    C
0    D
1    E
1    F
1    G
dtype: object

推荐阅读