是否有一种优雅的方式将别名映射到连接的数据文件中的真实实体名称?

问题描述

我有一个包含连接数据的大 csv 文件,例如:

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,你可以试试:

  1. source / target 获取公共元素。
  2. common elementstarget 的值替换为所需的值。
  3. 删除带有 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