2016-09-18 98 views
1

我有一個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很大,我正在尋找一個有效的解決方案。

這樣做的好方法是什麼?

+0

你需要什麼在最後 - 一個DF或CSV文件? – MaxU

回答

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

這也是一個很好的答案。現在我不知道哪一個可以接受。 – eleanora

+1

@eleanora你可以接受這個。沒關係。 –

+0

@eleanora,只需投擲一枚硬幣! ;) – MaxU

1

你的確可以groupby,然後applylist

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 

將其寫入到一個CSV文件,可以使用

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) 
+0

哦,我不知道謝謝你!如果我想以問題的形式將它作爲csv輸出,那也很簡單嗎? – eleanora

+0

@eleanora Re。 CSV輸出,請參閱更新。 –

+0

非常感謝你。 – eleanora

1
您可以使用:
df.groupby('id1')['id2'].apply(','.join).reset_index() 

另一種解決方案,其中輸出列表:

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

非常感謝。 – eleanora

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