Python:将每行一个值的CSV转换为每行多个值,第一个值为键

时间:2015-08-25 12:11:07

标签: python csv

我一直在寻找这个互联网上的答案。 我发现答案非常相似,并且接近这个答案,但对我来说还不够相似。

我一直在尝试将每行具有单个值的CSV文件转换和/或重新排序为具有多行值(以逗号分隔)的CSV格式。

输入CSV如下所示:

id,image
001,han.jpg
001,leia.jpg
001,chewie.jpg
002,stewie.jpg
002,meg.jpg
003,marty.jpg
003,doc_brown.jpg
003,biff.jpg

我需要输出如下:

id,image
001,han.jpg,leia.jpg,chewie.jpg
002,stewie.jpg,meg.jpg
003,marty.jpg,doc-brown.jpg,biff.jpg

我知道这可能最终会成为无效的CSV格式,但这不是我的CSV的最终形式,这只是介于两者之间的一步。在此之后会有更多的魔力; - )。

我希望使用Python来实现这一目标,因为这将成为我已经用Python编写的脚本的一部分。

我已经研究了很长一段时间了,所以如果有人愿意提供帮助,那就太棒了!

2 个答案:

答案 0 :(得分:1)

你走了,

import csv
lines =[]
with open(inputFile,'rb') as f:
    for line in csv.reader(f):
        lines.append(line)
def groupUp (lines):
    finalList = []
    for row in lines:
        for i,otherRow in enumerate(finalList):
            if row[0]==otherRow[0]:
                finalList[i] += row[1:]
                break
        else:
            finalList.append(row)
    return finalList

with open(newFile,'wb') as f:
    a = csv.writer(f)
    a.writerows(groupUp(lines))

答案 1 :(得分:0)

此代码可以执行您想要的操作:

import pandas as pd
import io

input = """id,image
001,han.jpg
001,leia.jpg
001,chewie.jpg
002,stewie.jpg
002,meg.jpg
003,marty.jpg
003,doc_brown.jpg
003,biff.jpg"""

# read the csv with pandas
df = pd.read_csv(io.BytesIO(input))

output = "id,image\n"
# group the dataset by id
for id_, data in df.groupby("id"):
    # that's a bit ugly, but it generates a line in the format you want
    output += "%d,%s\n" % (id_, ",".join(data["image"].values))

print output[:-1] # removes the last '\n'

正如您所说,输出不再是CSV文件。也许另一种格式更合适。例如,JSON可能更适合您的问题。