我有一个节点和边缘列表,如下所示:
Id Label Type
1 fie gnome
2 fou giant
3 fim gnome
4 fee dwarf
Source target Weight
fie fou 2
fie fim 2
fou fee 2
fee fim 3
如何使用节点文件中的索引替换源文件和目标文件中的名称?
最终输出应为:
Source target Weight
1 2 2
1 3 2
2 4 2
4 3 3
答案 0 :(得分:3)
我可能会从dict
和nodes.Label
构建nodes.Id
,然后将其传递给replace()
或applymap
。例如:
>>> weight.stack().replace(dict(zip(nodes.Label, nodes.Id))).unstack()
Source target Weight
0 1 2 2
1 1 3 2
2 2 4 2
3 4 3 3
>>> d = dict(zip(nodes.Label, nodes.Id))
>>> weight.applymap(lambda x: d.get(x,x))
Source target Weight
0 1 2 2
1 1 3 2
2 2 4 2
3 4 3 3
一些解释。首先,我们从DataFrames开始:
>>> nodes
Id Label Type
0 1 fie gnome
1 2 fou giant
2 3 fim gnome
3 4 fee dwarf
>>> weight
Source target Weight
0 fie fou 2
1 fie fim 2
2 fou fee 2
3 fee fim 3
然后我们制作dict
我们要用以下内容替换:
>>> d = dict(zip(nodes.Label, nodes.Id))
>>> d
{'fou': 2, 'fim': 3, 'fee': 4, 'fie': 1}
不幸的是.replace()
并不像您认为的那样在DataFrame上工作,因为它适用于行和列,而不是元素。但我们可以stack
和unstack
来解决这个问题:
>>> weight.stack()
0 Source fie
target fou
Weight 2
1 Source fie
target fim
Weight 2
2 Source fou
target fee
Weight 2
3 Source fee
target fim
Weight 3
dtype: object
>>> weight.stack().replace(d)
0 Source 1
target 2
Weight 2
1 Source 1
target 3
Weight 2
2 Source 2
target 4
Weight 2
3 Source 4
target 3
Weight 3
dtype: object
>>> weight.stack().replace(d).unstack()
Source target Weight
0 1 2 2
1 1 3 2
2 2 4 2
3 4 3 3
或者,我们也可以使用lambda
和applymap
。字典有get
方法接受默认参数,因此somedict.get(k, 'default value goes here')
将向上看键k
,如果找到键则返回相应的值,否则返回第二个参数。因此,d.get(x, x)
会将x
更改为字典中的相应值,或者返回x
并将其保留。因此:
>>> weight.applymap(lambda x: d.get(x,x))
Source target Weight
0 1 2 2
1 1 3 2
2 2 4 2
3 4 3 3
PS:如果您只想将替换应用于某些列,则相同的基于dict的方法将起作用,但您必须限制应用程序。例如,如果您想采用其他方式,您可能不希望权重列中的2
成为fou
。