3 回答
TA贡献1875条经验 获得超3个赞
下面应该让你开始(原谅懒惰的变量命名)。主要思想是利用groupbyitertools 中的现有字段按您想要的任何字段进行聚合,然后通过将结果收集到字典中,从这些分组中提取您想要平均的相关字段。
PS - 希望这不是你的作业,因为那只是懒惰:)
stuff = """country continent year lifeExp pop gdpPercap
Zambia Africa 2002 39.193 10595811 1071.613938
Zambia Africa 2007 42.384 11746035 1271.211593
Zimbabwe Africa 1952 48.451 3080907 406.8841148
Zimbabwe Africa 1957 50.469 3646340 518.7642681
Zimbabwe Africa 1962 52.358 4277736 527.2721818
Zimbabwe Africa 1967 53.995 4995432 569.7950712
Zimbabwe Africa 1972 55.635 5861135 799.3621758
Zimbabwe Africa 1977 57.674 6642107 685.5876821
Zimbabwe Africa 1982 60.363 7636524 788.8550411
Zimbabwe Africa 1987 62.351 9216418 706.1573059
Zimbabwe Africa 1992 60.377 10704340 693.4207856
Zimbabwe Africa 1997 46.809 11404948 792.4499603
Zimbabwe Africa 2002 39.989 11926563 672.0386227
Zimbabwe Africa 2007 43.487 12311143 469.7092981
Argentina Americas 1952 62.485 17876956 5911.315053
Argentina Americas 1957 64.399 19610538 6856.856212
Argentina Americas 1962 65.142 21283783 7133.166023
Argentina Americas 1967 65.634 22934225 8052.953021
Argentina Americas 1972 67.065 24779799 9443.038526
Argentina Americas 1977 68.481 26983828 10079.02674""".strip().splitlines()
import itertools
from collections import defaultdict
stuff = [line.split() for line in stuff]
headers, *records = stuff
labeled_records = [dict(zip(headers,line)) for line in records]
#group by continent
grouped = itertools.groupby(labeled_records,lambda x: x['continent'])
results = defaultdict(list)
# for other categories, just change 'lifeExp' to the column you want
for k,v in grouped:
for d in v:
results[k].append(float(d['lifeExp']))
# average collected results
for k,v in results.items():
print(k,'\t',sum(v)/len(v))
TA贡献1829条经验 获得超9个赞
对于 groupby,您可以只使用一个字典,您可以使用该字典以编程方式填充键,并且值以 null 开头并以 3 元组列表结尾;它包含列名、计算类型以及您应该为给定组合返回的值。
可能有更漂亮和更优雅的方式,但这应该有效。
编辑:等一下,它们将是 2 元组,因为您已经指定了列(我的意思是大陆)名称。我想我还在半梦半醒。
您也可以制作一个包含所有相关值的 n 维列表(矩阵)。这将是明智的做法。
TA贡献1111条经验 获得超0个赞
我不想破坏计算解决方案的乐趣,但您可以将其转换为字典列表,这将使数据更易于管理。为此,您需要拆分所有子列表,我们从第 1 行用自己的列表压缩每个子列表,这些将是我们的键,然后我们可以用键压缩这些子列表。之后,我们使用dict()构造函数来创建我们的字典列表。
有了这个,你可以做诸如此类的事情for i in res: print(i['country'],从列表中提取只属于某个国家的字典等等。
import csv
import pprint
with open('gapminder.tsv', 'r') as gap:
csv_reader = csv.reader(gap, delimiter="\t")
lst = list(csv_reader)
lst = [i[0].split() for i in lst]
prep = zip([lst[0]]*len(lst[1:]), lst[1:])
prep = [(zip(i[0], i[1])) for i in prep]
res = [dict([j for j in i]) for i in prep]
pprint.pprint(res)
[{'continent': 'Africa',
'country': 'Zambia',
'gdpPercap': '1071.613938',
'lifeExp': '39.193',
'pop': '10595811',
'year': '2002'},
{'continent': 'Africa',
'country': 'Zambia',
'gdpPercap': '1271.211593',
'lifeExp': '42.384',
'pop': '11746035',
'year': '2007'},
...
添加回答
举报