使用Python3标准库重写Pandas脚本

使用Python3标准库重写Pandas脚本,python,python-3.x,pandas,Python,Python 3.x,Pandas,以下是用Pandas编写的脚本,我必须使用标准库重写该脚本: import pandas as pd import sys if __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

以下是用Pandas编写的脚本,我必须使用标准库重写该脚本:

import pandas as pd
import sys

if __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 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 
以下是输出应该是什么:

             lifeExp     gdpPercap
continent
Africa     48.865330   2193.754578
Americas   64.658737   7136.110356
Asia       60.064903   7902.150428
Europe     71.903686  14469.475533
Oceania    74.326208  18621.609223
我卡住了。我可以用csv模块解析代码,但不能再进一步了。这是我的密码:

import sys 
import csv

with open('gapminder.tsv', 'r') as gap:
    csv_reader = csv.reader(gap, delimiter="\t")
    lst = list(csv_reader)

    for row in lst: 
        if row [1] == 'Africa': 
            pop = []
            pop.append(row[4])

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

可能有更漂亮、更优雅的方式,但这应该是可行的

编辑:等等,不,它们应该是2元组,因为您已经指定了列(我指的是大陆)名称。我想我还是半睡半醒


您还可以创建一个包含所有相关值的n维列表(矩阵)。这是一种明智的方法。

下面的内容应该让您开始(请原谅惰性变量命名)。其主要思想是利用itertools中现有的
groupby
,按您想要的字段进行聚合,然后从这些分组中提取出您想要平均的相关字段,方法是将结果收集到字典中

希望这不是你的家庭作业,因为那只是懒惰:)


我不想破坏计算解决方案的乐趣,但您可以将其转换为字典列表,这将使数据更易于管理。要做到这一点,您需要拆分所有子列表,我们需要使用第1行中的列表压缩每个子列表,这些列表将是我们的键,然后我们可以使用键压缩这些子列表。之后,我们使用
dict()
构造函数创建字典列表

有了它,你可以为i在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)

谢谢,我会开始用那种方法到处找的。
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'},
...