我有包含图表的文件。该文件是一个包含两列的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万个节点。
似乎分解可能是我想要的,但我想在同一索引空间中分解数据帧的两列,这似乎不明显。
我已经建立了从名称到ID的索引,我只是不知道如何用ID替换原始数据帧。这将是某种"合并"操作我不熟悉。
答案 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