2015-10-07 73 views
2

我有一個csv文件,其中有數千個需要分成組的條目。在下面的例子中,我需要根據River Name將每行分成幾組,以便稍後我可以根據組的信息重新格式化信息。使用Python對csv數據進行分組

River Name, Branch, Length 
Catnip, 1, 2145.30 
Peterson, 2, 24.5 
Catnip, 3, 15.4 
Fergerson, 1, 5.2 
Catnip, 1, 88.56 
Peterson, 2, 6.45 

我能想到的將信息分組將是唯一的辦法:

  1. 使用Python讀取CSV和剛剛創造獨特的河流名稱的列表。
  2. 根據獨特的河流名稱創建新的個人csv,例如Peterson.csv, Catnip.csv。
  3. 使用python讀取原始csv,並根據正在讀取的行的河流名稱,將該行寫入相應的.csv文件。例如,行貓薄荷,1,2145.30將被寫入到catnip.csv

我不認爲這是一個傳出的方式去這個,因爲它給了我1500 CSV,將需要打開並寫入,但我處於蟒蛇知識的極限。如果任何人能夠提供更好的方法論,將不勝感激。

回答

1

您也可以簡單地使用csv模塊並將結果保存到字典中。我列舉了讀者跳過第一行(我確定必須有一個更簡單的方法...)。然後我讀取每一行並將值分配給river,branchlength。如果河流不在字典中,則它用一個空的列表初始化它。然後它將branchlength的元組對添加到字典中。

rivers = {} 
with open('rivers.csv', mode='rU') as f: 
    reader = csv.reader(f, delimiter=',') # dialect=csv.excel_tab? 
    for n, row in enumerate(reader): 
     if not n: 
      # Skip header row (n = 0). 
      continue 
     river, branch, length = row 
     if river not in rivers: 
      rivers[river] = list() 
     rivers[river].append((branch, length)) 

>>> rivers 
{'Catnip': [('1', '2145.3'), ('3', '15.4'), ('1', '88.56')], 
'Fergerson': [('1', '5.2')], 
'Peterson': [('2', '24.5'), ('2', '6.45')]} 
2

可以使用pandas庫。 閱讀與delimitter逗號CSV文件,

import pandas as pd 
df = pd.read_csv('yourfile.csv',sep=',') 

DF的大熊貓一dataframe,它是用來處理導入的CSV文件。

pandas會自動將您的csv文件分割成列/行。 您只需使用df['River Name']即可訪問River Name列。

1

一個collections.defaultdict將這樣的伎倆:

from collections import defaultdict, namedtuple 
import csv 

branches = defaultdict(set) 
Branch = namedtuple('Branch', 'branch length'.split()) 

with open('rivers.csv') as fin: 
    reader = csv.DictReader(fin) 
    for row in reader: 
     branch = Branch(row['Branch'], row['Length']) 
     branches[row['River Name']].add(branch) 

for river in branches: 
    with open(river+'.csv', 'w') as fout: 
     writer = csv.DictWriter(fout, ['Branch', 'Length']) 
     writer.writeheader() 
     for branch in branches[river]: 
      writer.writerow({'Branch': branch.branch, 
             'Length': branch.length}) 
1

使用發電機

FILENAME = "river.csv" 
river_dict = dict() 

with open(FILENAME) as fd: 
    line = (l for l in fd.readlines()) 
    detail = (d.split(',') for d in line) 
    for river_name, branch, length in detail: 
     river_name, branch, length = map(str.strip, [river_name, branch, length]) 
     with open(river_name.title() + ".csv", "a") as rd: 
      rd.write("{0}, {1}\n".format(branch, length))