Переписывание скрипта Pandas с использованием стандартной библиотеки Python3 - PullRequest
0 голосов
/ 10 октября 2018

Вот скрипт, написанный на 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])

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Ниже следует начать (простите за ленивое именование переменных).Основная идея состоит в том, чтобы использовать существующие groupby из itertools для агрегирования по любому полю, которое вы хотите, а затем из этих групп вывести соответствующее поле, которое вы хотите усреднить, собирая результаты в словарь.

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))
0 голосов
/ 10 октября 2018

Я не хочу испортить удовольствие от расчета решений, но вы можете преобразовать это в список словарей, который облегчит управление данными.Для этого вам нужно разделить все подсписки, чтобы каждый из подсписков был пронизан собственным списком из строки 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'},
...
0 голосов
/ 10 октября 2018

Для группы вы можете просто использовать словарь, которым вы заполняете ключи программно, а значения начинаются с нуля и заканчиваются списком из трех кортежей;у него будет имя столбца, тип расчета и значение, которое вы должны возвращать для данной комбинации.

Могут быть более красивые и элегантные способы, но это должно сработать.

Изменить: подождите, нет, они будут 2 кортежей, так как вы уже указали имя столбца (я имел в виду континент).Я думаю, что я все еще наполовину сплю.

Вы также можете просто сделать n-мерный список (матрицу), который содержит все соответствующие значения.Это был бы разумный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...