使用字典按年份对csv文件进行排序(Python 3.X)

时间:2018-11-26 19:13:04

标签: python python-3.x csv dictionary

我有一个csv文件,其中包含电影数据,如下所示(示例):

year revenue
2013 3000
2013 4000
2013 5000
2012 1500
2012 3000
2011 2000
2011 1000

我想创建一个具有以下信息的新csv文件:

year year_freq total_rev
2013 3         12000
2012 2         4500
2011 2         3000

等等。

到目前为止,这是我的代码(仅从处理年份频率开始)...我被卡住了。

import csv
from collections import Counter
i=0
nummovies={}
yearrev={}
with open ('movies.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
for line in csv_reader:
    try:
        if line['year'] in nummovies:
            nummovies[line['year']]+=1
        else:
            nummovies=line['year']
    except ValueError:
            i=0
for key,value in nummovies.items():
    print(key,value)

print(i)

3 个答案:

答案 0 :(得分:0)

这是实现这一目标的一种方法。

要做的第一件事是分析我们在这里想要实现的目标,并概述我们需要做的工作:

  1. 读取数据(由于您已经自己实现,因此我将“模拟”这一步骤)
  2. 收集统计信息
  3. 将统计信息写入文件

作为保持环境整洁的一种方法,我们可以创建一个“ main”函数来完成该任务:

def analyze_movie_data():
    data = read_data()
    stats = get_stats(data)
    write_stats_to_csv(stats)

然后是实施细节。请注意,我还创建了一个帮助方法来逐行收集统计信息-再次,这样我就不必一次在脑海中保持太多逻辑。


from csv import DictWriter

def read_data():
    lines = [
        {'year': 2011, 'revenue': 1000},
        {'year': 2012, 'revenue': 2000},
        {'year': 2011, 'revenue': 3000},
        {'year': 2012, 'revenue': 4000},
        {'year': 2011, 'revenue': 5000},
    ]
    return lines


def get_stats(lines):

    def add_line(stats, line):
        year = line['year']

        if year not in stats:
            stats[year] = {'year': year, 'freq': 0, 'total_revenue': 0}

        stats[year]['freq'] += 1
        stats[year]['total_revenue'] += line['revenue']

    stats = {}
    for line in lines:
        add_line(stats, line)
    return stats


def write_stats_to_csv(stats):
    columns = ['year', 'freq', 'total_revenue']

    with open('stats.csv', 'w', newline='') as output:
        writer = DictWriter(output, columns)
        writer.writeheader()
        for year in stats:
            writer.writerow(stats[year])



def analyze_movie_data():
    data = read_data()
    stats = get_stats(data)
    write_stats_to_csv(stats)

analyze_movie_data()

然后输出(对于我的模拟输入):

year,freq,total_revenue
2011,3,9000
2012,2,6000

答案 1 :(得分:0)

@lessreg:假设数据是:

data = 2013, 3000, 2013, 4000, 2013, 5000, 2012, 1500, 2012, 3000, 2011, 2000, 2011, 1000

我们可以编写以下代码

years = [data[x] for x in range(len(data)) if x % 2 == 0]
revenues = [data[x] for x in range(len(data)) if x % 2 == 1]

def reorder(year, rev):
    YEARS = year.copy()
    REVENUE = rev.copy()
    ans = []
    for year in YEARS:
        count = YEARS.count(year)
        total_rev = 0
        for i in range(count):
            j = YEARS.index(year)
            total_rev += REVENUE[j]
            del YEARS[j], REVENUE[j]
        ans.extend([year, count, total_rev]
    return ans

答案 2 :(得分:0)

我提供了易于阅读和理解的解决方案。

由于您按年份分组,将其用作密钥仅是有意义的。字典中的值具有两种属性,因此属于复杂类型。将它们分组在一起的最简单形式是使用元组。 (更复杂的案例可以具有类,并在其上实现了各种业务逻辑。)

您尝试访问当年的记录,并增加计数器并更新收入。如果没有数据,则将计数器和收入设为0。

collector = {}
for year, revenue in zip(years, revenues):
    count, total = collector.setdefault(year, (0,0)) # will return (0,0) if year is not already in the dictionary
    count += 1
    total += revenue
    collector[year] = (count, total)