问题描述
Source,Target
a,token
b,token2
c,token3
d,j
e,k
f,l
token,g
token2,h
token3,i
文件的结构是混合的,所以关系所在的行
a,token3
不标识网络图中的特定关系,而是定义实体 a、b 和 c 映射到的别名。
在文件的其余部分,我有标准关系 (d,j; e,k; f,l) 以及实体的真实名称被其别名替换的关系:
token,i
目前,我正在使用丑陋的“for”循环遍历文件,这样我就能够以所需的方式映射关系并获得:
a,g
b,h
c,i
但这不是一种优雅的方式,而且可能对我的 cpu 造成沉重负担。
是否有任何内置函数(可能在 Pandas 中)或一些优雅快捷的方法(几行代码)来映射 Python 中所需的文件?
解决方法
data = [
['a','token'],['b','token2'],['c','token3'],['d','j'],['e','k'],['f','l'],['token','g'],['token2','h'],['token3','i']
]
df = pd.DataFrame(data,columns=['Source','Target'])
source_to_target = {row.Source: row.Target for row in df.itertuples()}
df.loc[:,'AliasedTarget'] = df.loc[:,'Target'].apply(lambda x: source_to_target.get(x,x))
print(df.head())
Source Target AliasedTarget
0 a token g
1 b token2 h
2 c token3 i
3 d j j
4 e k k
,
IIUC,你可以试试:
- 从
source
/target
获取公共元素。 - 将
common elements
中target
的值替换为所需的值。 - 删除带有
common elements
的行。
import numpy as np
common_elements = np.intersect1d(df.Source.values,df.Target.values)
df.Target = df.Target.replace(dict(df[df.Source.isin(common_elements)].values))
df = df[~df.Source.isin(common_elements)]
输出:
Source Target
0 a g
1 b h
2 c i
3 d j
4 e k
5 f l