使用Pandas从单独的文件替换索引的名称

时间:2013-04-19 15:42:47

标签: python indexing pandas

我有一个节点和边缘列表,如下所示:

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

1 个答案:

答案 0 :(得分:3)

我可能会从dictnodes.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上工作,因为它适用于行和列,而不是元素。但我们可以stackunstack来解决这个问题:

>>> 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

或者,我们也可以使用lambdaapplymap。字典有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