私はおそらくdict
fromnodes.Label
と を構築し、それを toまたは に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
いくつかの説明。まず、DataFrame から始めます。
>>> 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
あるいは、単に alambda
と を使用することもできますapplymap
。辞書get
には、デフォルトのパラメーターを受け入れるメソッドがあるためsomedict.get(k, 'default value goes here')
、キーを検索しk
、キーが見つかった場合は対応する値を返し、そうでない場合は 2 番目のパラメーターを返します。そのため、辞書内の対応する値に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:特定の列にのみ置換を適用する場合は、同じ辞書ベースのアプローチが機能しますが、アプリケーションを制限する必要があります。たとえば、逆の方向に進みたい場合は、おそらく2
重み列の が になることを望まないでしょうfou
。