如何将CSV文件中的多行合并为一行

4
我需要对一份庞大的CSV文件进行裁剪,以便用于机器学习。我已经找到了将该文件分解为我所需的两行数据的方法,但是我遇到了一个问题。
基本上我的文件结构如下。
 "David", "Red"
 "David", "Ford"
 "David", "Blue"
 "David", "Aspergers"
 "Steve", "Red"
 "Steve", "Vauxhall"

而我需要数据看起来更像这样...

"David, "Red", "Ford", "Blue", "Aspergers"
"Steve", "Red", "Vaxhaull"

我目前有这个来剥离CSV文件

import csv

cr = csv.reader(open("traits.csv","rb"), delimiter=',', lineterminator='\n')
cr.next() #skipping header line, no point in removing it as I need to standardise data manipuation.


# Print out the id of species and trait values
print 'Stripping input'
vals = [(row[1], row[4]) for row in cr]
print str(vals) + '\n'

with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(vals)
    print 'Sucessfully written to file output.csv'


#for row in cr:
#print row
2个回答

5
使用字典将名称作为键,其他属性作为值存储在列表中:
my_dict={}
with open("traits.csv","rb") as f:
   cr = csv.reader(f, delimiter=',', lineterminator='\n')
   for row in cr:
       my_dict.setdefault(row[0].strip('" '),[]).append(row[1].strip('" '))

结果:

print my_dict
{'Steve': ['Red', 'Vauxhall'], 'David': ['Red', 'Ford', 'Blue', 'Aspergers']}

新建文件写入内容的方法:

with open("output.csv", "wb") as f:
    writer = csv.writer(f,delimiter=',')
    for i,j in my_dict.iteritems():
        writer.writerow([i]+j)

setdefault(key[, default])

如果字典中有key这个键,返回它对应的值;如果没有,将key和默认值default插入字典,并返回默认值。其中,default默认为None。


我目前得到的输出是:AttributeError: 'list' object has no attribute 'setdefault' - KeironO
@KeironO 也许你有一个名为 d 的列表(并在 d={} 之后定义它),我更改了它的名称!请尝试编辑后的答案! - Mazdak
我仍然不清楚如何将其集成到我的程序中。它似乎可以工作,但是为什么没有打印出第四行呢?(只有第一行) - KeironO
@KeironO 抱歉,我不明白你所说的第四行是什么意思!如果你想将它写入一个新的 CSV 文件中,只需循环遍历字典项并将它们写入即可。 - Mazdak
我认为我的问题不够充分,对此我深感抱歉。原始文本文件看起来像这样..."David", "Orange", "Purple", "Red"我需要忽略第二个和第三个,同时也要按照我在原帖中所说的去做。 - KeironO

0

使用 defaultdict,这正是你所需要的,以下是一个示例:

>>> from collections import defaultdict
>>> md = defaultdict(list)
>>> md[1].append('a')
>>> md[1].append('b')
>>> md[2].append('c')
>>> md[1]
['a', 'b']
>>> md[2]
['c']



(你可以使用集合而不是列表,这种情况下你需要调用 .add 而不是 .append。)

你可以使用 iteritems 来轻松访问数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接