我有一个看起来像
的csvid1,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 :(得分: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)))