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
我如何用熊猫做到这一点? 帮助将不胜感激!
答案 0 :(得分:5)
这似乎是一个图形,即networkx库问题。让我们在图网络(see this wiki page)内的连接组件中查找节点。
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