如何有效地从边列表创建邻接列表

时间:2016-09-18 20:16:24

标签: python pandas graph

我有一个看起来像

的csv
id1,id2
a,b
c,d
a,e
c,f
c,g

我用df = pd.read_csv(" file.csv")将其读入数据框。

我想将其转换为邻接列表。那就是输出应该是

a,b,e
c,d,f,g

我觉得df.groupby(' id1')应该有帮助,但是可变长度的行不适合熊猫,所以我有点卡住了。由于我的csv很大,我正在寻找一种有效的解决方案。

这样做的好方法是什么?

4 个答案:

答案 0 :(得分:1)

您确实可以apply,然后list In [48]: df = pd.DataFrame({'id1': ['a', 'c', 'a', 'c', 'c'], 'id2': ['b', 'd', 'e', 'f', 'g']}) In [49]: df.id2.groupby(df.id1).apply(list) Out[49]: id1 a [b, e] c [d, f, g] Name: id2, dtype: object

df1 = df.id2.groupby(df.id1).apply(list).apply(lambda l: ','.join(l)).reset_index()

df1.id1.str.cat(df1.id2, sep=',').to_csv('stuff.csv', index=False)

要将其写入CSV文件,您可以使用

{{1}}

答案 1 :(得分:1)

如果您需要CSV字符串:

In [107]: df.groupby('id1').id2.apply(lambda x: ','.join(x)).reset_index()
Out[107]:
  id1    id2
0   a    b,e
1   c  d,f,g

答案 2 :(得分:1)

您可以使用:

df.groupby('id1')['id2'].apply(','.join).reset_index()

输出为list的另一种解决方案:

df.groupby('id1')['id2'].apply(lambda x: x.tolist())

答案 3 :(得分:0)

这样的事情:

adj = defaultdict(set)
for line in input:
    left, right = line.split(",")
    adj[left].add(right)

输出:

for k,v in adj.items():
    print("%s,%s" % (k, ",".join(v)))