我有一个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)
答案 0 :(得分:0)
这是实现这一目标的一种方法。
要做的第一件事是分析我们在这里想要实现的目标,并概述我们需要做的工作:
作为保持环境整洁的一种方法,我们可以创建一个“ 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)