使用Python对csv数据进行分组

时间:2015-10-07 06:16:44

标签: python csv

我有一个csv文件,其中包含数千个需要分组的条目。在下面的示例中,我需要根据River Name将每行分成若干组,以便稍后我可以根据其组重新格式化信息。

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文件。例如,行catnip,1,2155.30将被写入catnip.csv
  4. 我不认为这是一种传播方式,因为它给了我大约1500 csv需要开放和写入,但我在我的python知识极限。如果任何人能提供更好的方法论,我们将不胜感激。

5 个答案:

答案 0 :(得分:3)

您也可以简单地使用csv模块并将结果保存到字典中。我列举了读者跳过第一行(我确定必须有一个更简单的方法......)。然后,我读取每一行并将值分配给riverbranchlength。如果河流不在字典中,则用空列表初始化它。然后它会将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')]}

答案 1 :(得分:1)

python pandas可以处理csv数据集。我没有做过任何与之相关的事情,但最好先检查一下大熊猫。

http://pandas.pydata.org/pandas-docs/stable/

答案 2 :(得分:1)

您可以使用pandas库。 使用分隔符逗号

读取您的csv文件
import pandas as pd
df =  pd.read_csv('yourfile.csv',sep=',')

Df是pandas中的dataframe,它用于处理导入的csv文件。

pandas会自动将csv文件分区为列/行。 您只需使用df['River Name']访问River Name列。

答案 3 :(得分: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})

答案 4 :(得分: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))