我有一个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
我能想到的将信息分组的唯一方法是:
我不认为这是一种传播方式,因为它给了我大约1500 csv需要开放和写入,但我在我的python知识极限。如果任何人能提供更好的方法论,我们将不胜感激。
答案 0 :(得分:3)
您也可以简单地使用csv
模块并将结果保存到字典中。我列举了读者跳过第一行(我确定必须有一个更简单的方法......)。然后,我读取每一行并将值分配给river
,branch
和length
。如果河流不在字典中,则用空列表初始化它。然后它会将branch
和length
的元组对添加到字典中。
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数据集。我没有做过任何与之相关的事情,但最好先检查一下大熊猫。
答案 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))