为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Python3 标准库重写 Pandas 脚本

使用 Python3 标准库重写 Pandas 脚本

尚方宝剑之说 2021-07-01 17:01:06
这是用 Pandas 编写的脚本,我必须使用标准库重写它:import pandas as pdimport sysif __name__ == '__main__':    if len(sys.argv) != 1 :        print('usage: python by_continent.py')        sys.exit(1)    gap = pd.read_csv('gapminder.tsv', sep='\t')    means = gap.groupby('continent').mean()    parts = means[['lifeExp', 'gdpPercap']]    print( parts )输入看起来像:country continent   year    lifeExp pop gdpPercapZambia  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 这是输出应该是什么:             lifeExp     gdpPercapcontinentAfrica     48.865330   2193.754578Americas   64.658737   7136.110356Asia       60.064903   7902.150428Europe     71.903686  14469.475533Oceania    74.326208  18621.609223
查看完整描述

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))


查看完整回答
反对 回复 2021-07-13
?
PIPIONE

TA贡献1829条经验 获得超9个赞

对于 groupby,您可以只使用一个字典,您可以使用该字典以编程方式填充键,并且值以 null 开头并以 3 元组列表结尾;它包含列名、计算类型以及您应该为给定组合返回的值。

可能有更漂亮和更优雅的方式,但这应该有效。

编辑:等一下,它们将是 2 元组,因为您已经指定了列(我的意思是大陆)名称。我想我还在半梦半醒。

您也可以制作一个包含所有相关值的 n 维列表(矩阵)。这将是明智的做法。


查看完整回答
反对 回复 2021-07-13
?
catspeake

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'},

...


查看完整回答
反对 回复 2021-07-13
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信