2015-08-25 57 views
-4

我一直在搜索整個interwebs上的答案。 我發現答案非常相似,接近這一個,但不足以讓我完成工作。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格式,但這個ISN」 t我的CSV的最終形式,這只是介於兩者之間的一個步驟。之後會有更多的魔術;-)。

我想要一個使用Python來做到這一點的方法,這將成爲我已經用Python編寫的腳本的一部分。

我一直在研究這個相當長的一段時間,所以如果有人願意幫忙,那就太棒了!

+2

一般來說,這不是要求完整的解決方案的地方。顯示你有什麼,有人可能會告訴你如何做得更好。一個提示:假設'var'包含cvs的一行,'var.split(「,」)[0]'會給你id,'var.split(「,」)[1]'圖像。現在您需要研究打開/讀取文件以及如何通過文件循環... – 576i

+0

對不起,我不是故意要求完整的解決方案。在發佈之前,我做了很多閱讀(和黑客),並且閱讀了很多關於'Zip','Pandas'和常規'csv'包的內容。我不知道從哪裏開始,我猜:-)。由於我不清楚,我認爲提供太多的信息會導致更簡單的解決方案被丟棄或被忽略。我一定會在下次張貼時附上一些我自己的片段。感謝指針順便說一句。如果我研究其餘的話,這可能會奏效。 – xblackbytesx

回答

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

嗨SuJaY,非常感謝!這正是我需要的!而且你的迴應也非常快!現在我是一名成員,我將爲Stack Overflow做出貢獻。我的專長主要是前端開發,所以我可能有朝一日能夠得到回報:-)。我真的很高興終於有這個解決方案!再次感謝! – xblackbytesx

+0

嗨,歡迎您,但如果這可以幫助您,您可以善意投票或標記爲最佳答案,因爲這可以幫助我很多,而且我可以貢獻更多。 –

+1

嗨@SuJaY我想upvote你,我嘗試儘快發佈這個答案,但我根本沒有足夠的聲譽呢:(。對不起,只要我收集足夠的聲望點,我會回到這個問題,並upvote你。Perstonally我認爲這是非常蹩腳的,我不能夠upvote評論我自己創建的問題,雖然.. – xblackbytesx

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可能更適合您的問題。

+0

嗨保羅,非常感謝您的快速響應和您的完整答案。我真的很驚訝你能像你一樣快速地幫助我!這個解決方案完美運作然而,SuJaY的版本使用'csv'包而不是Pandas。我的腳本已經包含了csv包,所以出於這個原因,我可能會使用他的版本。但我真的很感謝你的回答,而且它的工作原理也一樣!這將成爲其他使用熊貓的好資源:-)。 – xblackbytesx

相關問題