Я пытался извлечь данные из этого 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] = {}
Может быть, это поможет:
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
, поэтому вы не можете отличить регион и страну от его идентификатора, вам нужно найти все имя и построить список регионов и стран, то вы сможете определить, принадлежит ли линия региону или стране.