1

次のようなノードとエッジ リストがあります。

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
4

1 に答える 1

3

私はおそらくdictfromnodes.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

于 2013-04-19T16:10:47.470 に答える