Как я могу посчитать вхождения строки в строке файла CSV, если другая строка имеет определенное значение? - PullRequest
0 голосов
/ 23 июня 2019

У меня есть CSV-файл с одним рядом значений страны и одним рядом олимпийских медалей. Я хочу посчитать, какая страна получила сколько медалей.

Я пробовал это с пандами, но он выдает мне сообщение об ошибке, что он не может найти строку "страна", хотя строка существует и называется страна Файл CSV:

screenshot of CSV file contents

from collections import Counter
import pandas as pd
import csv

with open('olympics.csv', 'r', encoding='utf-8', newline='') as csv_file:

    df = pd.read_csv("olympics.csv",
                     index_col=["NOC","Medal"])
                     #usecols=["NOC","Medal"])
    #df.sort_index()

    #grouped = df.groupby(['NOC', 'Medal'])

    grouped = df.groupby(['NOC','Medal'])['NOC'].count()

print(grouped)

Вывод должен быть таким:

USA 2366 
UK  2189 
Denmark 1455 
....

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Это можно решить с помощью DictReader из библиотеки "csv".

import csv
import collections

csv_file = open('olympics.csv', 'r', encoding='utf-8')
csv_input = csv.DictReader(csv_file)
country_medals_map = collections.defaultdict(int)
# initializes the country_medals_map with default value as int which will be 0.
# e.g test_dict = defaultdict(int), print(test_dict['not_set_key']) => 0

for input in csv_input:
    country_medals_map[input['NOC']] += 1 if input['Medal'] in ['Gold', 'Silver', 'Bronze'] else 0
    # set dict key as the rows country('NOC') value and increasing the dict value if medal present in GOLD SILVER or BRONZE.

 # finally printing our dict formed.
 for key, value in country_medals_map.items():
     print(key, '-', value)

 # output
 # GRE - 10
 # AUS - 5
 # Uk - 20

Если вы хотите отсортировать вывод, а не сортировать (обновлять) его при создании, то сортируйте его позже.

sorted_by_medals = sorted(country_medals_map.items(), key=lambda kv: kv[1], reverse=True)

# printing our sorted output
for item in sorted_by_medals:
     print(item)

# output
# ('Uk', 20)
# ('GRE', 10)
# ('AUS', 5)
0 голосов
/ 23 июня 2019

Наконец я нашел ответ без использования панд.

import csv

d = {}

with open('olympics.csv', 'r', encoding='utf-8', newline='') as f:

    dialect = csv.Sniffer().sniff(f.read(1024))
    #print(dialect)

    # Move to beginning of file
    f.seek(0)

    # DictReader uses the first row in the file as headers.
    r = csv.DictReader(f, dialect=dialect)

    for row in r:

        if row['Medal'] == 'Gold'or 'Silver'or 'Bronze':
            d[row['NOC']] = d.get(row['NOC'], 0) + 1
            #d.sort(key=itemgetter(1)
for k in d:
    #k.sort(key=lambda element: element[1]

    print('{}  {}'.format(k, d[k]))```````
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...