如何用熊猫系列中的索引替换项目

时间:2017-02-16 17:11:40

标签: pandas

问题陈述

我有包含图表的文件。该文件是一个包含两列的csv,源名称和目标名称。我想生成一个文件/数据框,其中源和目标是数字ID而不是字符串。

我知道这可以在python中完成,类​​似

node_names = list(set(source_node_names) | set(target_node_names))
names_to_ids = invert(dict(enumerate(node_names)))  
# followed by some sort of replace operation using this dictionary

但我正在努力学习大熊猫,并认为这是一个很好的机会。

一些问题:

  • 使用Categorical来解决这个问题是否合理?我没有这么认为,因为我的每个节点都不是一个类别,但我的谷歌搜索引导我朝这个方向发展。

  • 现在我有一系列的名字。 Series.factorize似乎很有希望,但我并不完全清楚回报是什么,主要是因为我不清楚大熊猫的指数是什么。

  • 元问题#1 :在某处有大熊猫指数的好解释吗?我无法找到大熊猫索引教程"可能部分原因是因为大熊猫有一个名为Indexing and Selecting Data的教程,我认为这个教程可以解答大多数人的问题,但是假设我不知道一些知识:

      

    pandas Index类及其子类可视为实现有序多集

    = 0

  • 元问题#2 :是否有任何优秀的资源来学习大熊猫?到目前为止,我一直在做大量的Google搜索和堆栈溢流,但我可能想要正确学习熊猫。有人信任的大型教程或书籍吗?

到目前为止我最好的想法:

我想我可以把我的一系列节点名称,以某种方式明确地使它成为一个数据帧,使得一列是索引,另一列是名称,然后使用图数据框执行两个merges,一次在源和一旦在目标上,我有源ID和目标ID,然后坚持这两个字段。我觉得必须有比两次合并更好的方法。

一些示例数据

按照@Cleb的要求。输入:

# I have                And I want: 
    RNF14   VDR             0   1
    RNF14   SMAD            0   2
    RNF14   UBE2D4          0   3
    RNF14   EIF2B5          0   4
    RNF14   UBE2D2          0   5
    RNF14   SMAD            0   6
    RNF14   UBE2D1          0   7
    RNF14   UBE2D3          0   8
    RNF14   IST1            0   9
    RNF14   EXOSC3          0   10
    RNF14   EXOSC5          0   11
    RNF14   SMURF1          0   12
    RNF14   SMURF2          0   13

显然这是一个微不足道的案例。我的图表中有大约一百万条边,可能有100万个节点。

更新#1:

似乎分解可能是我想要的,但我想在同一索引空间中分解数据帧的两列,这似乎不明显。

我已经建立了从名称到ID的索引,我只是不知道如何用ID替换原始数据帧。这将是某种"合并"操作我不熟悉。

1 个答案:

答案 0 :(得分:1)

我会在列中选择pd.factorize()

df.apply(lambda col: pd.factorize(col)[0]+1)

如果您希望每列中都有唯一ID,则可以先取消堆栈。

stacked = df.stack()
pd.DataFrame(stacked.factorize()[0], index=stacked.index).unstack()

<强>演示

>>> df = pd.DataFrame(dict(const=['things']*12, 
                           unqs=['foo']*4+['bar']*3+['baz']*5))

>>> df
     const unqs
0   things  foo
1   things  foo
2   things  foo
3   things  foo
4   things  bar
5   things  bar
6   things  bar
7   things  baz
8   things  baz
9   things  baz
10  things  baz
11  things  baz

>>> stacked = df.stack()

>>> pd.DataFrame(stacked.factorize()[0], index=stacked.index).unstack()
       0     
   const unqs
0      0    1
1      0    1
2      0    1
3      0    1
4      0    2
5      0    2
6      0    2
7      0    3
8      0    3
9      0    3
10     0    3
11     0    3