python - 自加入熊猫后如何获得两列之间的唯一关系?
问题描述
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
我怎样才能用熊猫做到这一点?帮助将不胜感激!
解决方案
这似乎是一个图表,即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
推荐阅读
- python-3.x - Anaconda3 2019.10 (64-bit) 安装卡在设置基础环境
- python-3.x - 如何在 python 中计算 FIX 消息的校验和
- javascript - Js - 检查对象的嵌套值是否相同
- python - 如何通过 Python 打开 Windows Powershell
- javascript - 玩 scss :export 指令
- r - 文件错误:无法打开 R 项目中文件的连接
- javascript - 如何在我的反应应用程序中获取 mp3 文件夹
- android - Android Room:插入几个具有关系的实体
- python - 如何打印多个数组/列表中的多个值,字符串仅在第一个输出前面,值之间用逗号分隔?
- javascript - 如何在js对象中找到匹配的键并返回它的值