Организация данных файла CSV (структурированные данные)

Я пытался извлечь данные из этого CSV-файла и организовать их таким образом, чтобы я мог более четко просматривать данные. Цель состоит в том, чтобы создать 2 словаря. Тот, который содержит данные из регионов, перечисленных в csv. И еще один, который содержит данные из стран в CSV. У меня возникли проблемы с циклическим просмотром данных. Сначала в файле csv отображаются все регионы. Только после того, как столбец «ID» достигнет числа 4, когда страны начали, мне просто нужна помощь в организации этого. у меня пока так. Но мне все еще нужна помощь в организации его в зависимости от региона и страны. Ссылка на файл csv: https://docs.google.com/document/d/1v68_QQX7Tn96l-b0LMO9YZ4ZAn_KWDMUJboa6LEyPr8/edit?usp=sharing

import csv

f = open('dph_SYB60_T03_Population Growth, Fertility and Mortality Indicators.csv')

reader = csv.DictReader(f)

data_by_region = {}
data_by_country = {}
answers = []


for line in reader:
  #Collects all the region names
  regions = line['Region/Country/Area'] 
  # Gets All the Years
  years = line['Year']
  # print(regions)



  if regions not in data_by_region:
    data_by_region[regions] = {}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Может быть, это поможет:

import csv

f = open('dph_SYB60_T03_Population Growth, Fertility and Mortality Indicators.csv', encoding='utf-8-sig')

reader = csv.DictReader(f)

data_by_region = {}
data_by_country = {}
answers = []

for line in reader:
    # Collects all the region names
    regions = line['Region/Country/Area']
    # Gets All the Years
    years = line['Year']
    # print(regions)

    if regions not in data_by_region:
        data_by_region[regions] = [line]
    else:
        data_by_region[regions].append(line)

# print data count group by regions.
for region, data_list in data_by_region.items():
    print('{:>30s}: {} rows.'.format(region, len(data_list)))

Выход:

 Total, all countries or areas: 21 rows.
                        Africa: 18 rows.
               Northern Africa: 21 rows.
            Sub-Saharan Africa: 21 rows.
                Eastern Africa: 18 rows.
                 Middle Africa: 18 rows.
               Southern Africa: 18 rows.
                Western Africa: 18 rows.
              Northern America: 18 rows.
...

В python есть встроенная функция groupby, помогающая вам группировать данные, но вам нужно отсортировать список с помощью группового ключа, поэтому, если вы хотите сгруппировать по Region/Country/Area, вам нужно сначала отсортировать его. следующий фрагмент должен помочь быстро сгруппировать ваши данные.

import csv
import itertools

def csv_iter(filepath):
    with open(filepath, mode = "r", encoding = "utf-8-sig") as f:
        reader = csv.DictReader(f)
        yield from reader

def main():
    filepath = "dph_SYB60_T03_Population Growth, Fertility and Mortality Indicators.csv"
    data_list = sorted(csv_iter(filepath), key=lambda x: x.get("Region/Country/Area", ""))
    for g, v in itertools.groupby(data_list, key=lambda x: x.get("Region/Country/Area", "")):
        print("{}: {}".format(g, len(list(v))))

if __name__ == "__main__":
    main()

выход:

Afghanistan: 21
Africa: 18
Albania: 21
Algeria: 21
American Samoa: 9
Andorra: 6
Angola: 21
Anguilla: 9
Antigua and Barbuda: 18
Argentina: 21
......

Но есть проблема, связанная с вашим пониманием ваших данных, не весь идентификатор региона ниже, чем 4, например, у Northern Africa есть идентификатор 15, поэтому вы не можете отличить регион и страну от его идентификатора, вам нужно найти все имя и построить список регионов и стран, то вы сможете определить, принадлежит ли линия региону или стране.

Другие вопросы по теме