Группировка данных по столбцам в csv файле по результатам выполнения функции

Alexandr Nimchenko

Новичок
Пользователь
Май 8, 2022
7
0
1
Всем привет! Подскажите, пожалуйста, как сгруппировать значения в csv? Привожу пример. В файле csv есть столбцы с именованием городов: Москва Калининград Курск
Нужно получить таблицу с группировкой по столбцам:
Код:
Москва Калининград Курск

2         3        1

3         1        1

4         2        3

5         0        0


По результатам выполнения функции получаю следующие значения:
Код:
Москва, 2
Калининград, 3
Курск, 1


На просторах Интернета ничего подходящего не нашел, а сам не смог придумать (опыта и знаний не хватает). Прошу Вашей помощи! Исходник:
Python:
import csv

     with open(f'tmp.csv', 'w') as file:
        writer = csv.writer(file)
        writer.writerow(('Москва','Калининград', 'Курск'))
        
        data = members
        json_str = json.dumps(data)
        resp = json.loads(json_str)

        def count(cities, raw):
            result = {}
            for city in cities:
                result[city] = raw.count(city)
            return result

        data = resp
        raw = []
        uniq_city = set()

        for item in data['items']:
            try:
                city = item['city']['title']
            except KeyError:
                continue
            raw.append(city)
            uniq_city.add(city)
        result = count(uniq_city, raw)

        for key, value in result.items():
            key_city = (f'{key}')
            value_city=(f'{value}')             
            
            with open(f'tmp.csv', 'a', encoding='utf-8', newline='') as file:
                writer = csv.writer(file,delimiter=",",lineterminator="\n")
                if key_city == 'Москва':
                    writer.writerow((value_city))
                elif key_city == 'Калининград':
                    writer.writerow((value_city))             
                elif key_city == 'Курск':
                    writer.writerow((value_city))
                else:
                    pass
 

rccp

Новичок
Пользователь
Май 12, 2022
13
2
3
таблица:
таблица.PNG


Python:
import csv
from collections import defaultdict

dictcity = defaultdict(int)
with open('города.csv', 'r', newline='',encoding='utf8') as csvfile:
    city = csv.reader(csvfile, delimiter=',')
    city_name = next(city) # определяем колонки (города), обычно первая строчка в csv
    for row in zip(city_name, *city): # проходим по все городам и строкам
        dictcity[row[0]] += sum((int(i) for i in row[1:])) # суммируем строку по ключу города

получаем сумму по городам:
Код:
defaultdict(int, {'Москва': 14, 'Калининград ': 6, 'Курск': 5})

ну или:

Python:
import pandas as pd

df = pd.read_csv('города.csv')
df.sum()

получаем:
Код:
Москва          14
Калининград      6
Курск            5
dtype: int64
 

Alexandr Nimchenko

Новичок
Пользователь
Май 8, 2022
7
0
1
таблица:
Посмотреть вложение 1817


Python:
import csv
from collections import defaultdict

dictcity = defaultdict(int)
with open('города.csv', 'r', newline='',encoding='utf8') as csvfile:
    city = csv.reader(csvfile, delimiter=',')
    city_name = next(city) # определяем колонки (города), обычно первая строчка в csv
    for row in zip(city_name, *city): # проходим по все городам и строкам
        dictcity[row[0]] += sum((int(i) for i in row[1:])) # суммируем строку по ключу города

получаем сумму по городам:
Код:
defaultdict(int, {'Москва': 14, 'Калининград ': 6, 'Курск': 5})

ну или:

Python:
import pandas as pd

df = pd.read_csv('города.csv')
df.sum()

получаем:
Код:
Москва          14
Калининград      6
Курск            5
dtype: int64
Добрый день, спасибо, выдаёт ошибку
Код:
ValueError: invalid literal for int() with base 10: 'Москва'
, подскажите, пожалуйста, как исправить?
 

rccp

Новичок
Пользователь
Май 12, 2022
13
2
3
Добрый день, спасибо, выдаёт ошибку
Код:
ValueError: invalid literal for int() with base 10: 'Москва'
, подскажите, пожалуйста, как исправить?
нужно смотреть csv файл, возможно первая строчка содержит данные (а не шапку таблицы)
 

Alexandr Nimchenko

Новичок
Пользователь
Май 8, 2022
7
0
1
city,value
Москва,3
Курск,6
Калининград,1
 

Alexandr Nimchenko

Новичок
Пользователь
Май 8, 2022
7
0
1
нужно смотреть csv файл, возможно первая строчка содержит данные (а не шапку таблицы)
формат таблицы (добавил заголовки, но все равно не помогло)
city,value
Москва,3
Курск,6
Калининград,1
 

rccp

Новичок
Пользователь
Май 12, 2022
13
2
3
формат таблицы (добавил заголовки, но все равно не помогло)
city,value
Москва,3
Курск,6
Калининград,1
Ок, тебе нужно просто поднять города наверх:

таблица было:

таблица1.PNG

таблица стало:

таблица2.PNG

код:

Python:
import csv
from collections import defaultdict

dictcity = defaultdict(list)
with open('города.csv', 'r', newline='',encoding='utf8') as csvfile:
    citys = csv.reader(csvfile, delimiter=';')
    drop = next(citys) # скидываем первую строку, она больше не нужна
    for city_value in citys:
        dictcity[city_value[0]].append(city_value[1]) # наполняем лист значениями из таблицы
        
    
    # делаем все листы одной длины
    lenrow = 0
    for row in dictcity.values():
        if lenrow < len(row):
            lenrow = len(row)
    for row in dictcity.items():
        if len(dictcity[row[0]]) < lenrow:
            dictcity[row[0]] = dictcity[row[0]] + [''] * (lenrow - len(dictcity[row[0]]))
            
    # транспонируем матрицу, чтобы значения были под колонкой города       
    transpose_matrix = [[list(dictcity.values())[j][i] for j in range(len(list(dictcity.values())))]
                                                       for i in range(len(list(dictcity.values())[0]))]

    
# создаем файл и записываем в него нашу новую таблицу       
with open('города_new.csv', 'w', newline='\n',encoding='utf8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(list(dictcity.keys()))
    for values in transpose_matrix:
        writer.writerow(values)
 

Alexandr Nimchenko

Новичок
Пользователь
Май 8, 2022
7
0
1
Ок, тебе нужно просто поднять города наверх:

таблица было:

Посмотреть вложение 1818

таблица стало:

Посмотреть вложение 1819

код:

Python:
import csv
from collections import defaultdict

dictcity = defaultdict(list)
with open('города.csv', 'r', newline='',encoding='utf8') as csvfile:
    citys = csv.reader(csvfile, delimiter=';')
    drop = next(citys) # скидываем первую строку, она больше не нужна
    for city_value in citys:
        dictcity[city_value[0]].append(city_value[1]) # наполняем лист значениями из таблицы
       
   
    # делаем все листы одной длины
    lenrow = 0
    for row in dictcity.values():
        if lenrow < len(row):
            lenrow = len(row)
    for row in dictcity.items():
        if len(dictcity[row[0]]) < lenrow:
            dictcity[row[0]] = dictcity[row[0]] + [''] * (lenrow - len(dictcity[row[0]]))
           
    # транспонируем матрицу, чтобы значения были под колонкой города      
    transpose_matrix = [[list(dictcity.values())[j][i] for j in range(len(list(dictcity.values())))]
                                                       for i in range(len(list(dictcity.values())[0]))]

   
# создаем файл и записываем в него нашу новую таблицу      
with open('города_new.csv', 'w', newline='\n',encoding='utf8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(list(dictcity.keys()))
    for values in transpose_matrix:
        writer.writerow(values)[
[QUOTE="rccp, post: 13995, member: 9613"]
Ок, тебе нужно просто поднять города наверх:

таблица было:

[ATTACH type="full" width="123px" alt="таблица1.PNG"]1818[/ATTACH]

таблица стало:

[ATTACH type="full" width="285px" alt="таблица2.PNG"]1819[/ATTACH]

код:

[CODE=python]import csv
from collections import defaultdict

dictcity = defaultdict(list)
with open('города.csv', 'r', newline='',encoding='utf8') as csvfile:
    citys = csv.reader(csvfile, delimiter=';')
    drop = next(citys) # скидываем первую строку, она больше не нужна
    for city_value in citys:
        dictcity[city_value[0]].append(city_value[1]) # наполняем лист значениями из таблицы
       
   
    # делаем все листы одной длины
    lenrow = 0
    for row in dictcity.values():
        if lenrow < len(row):
            lenrow = len(row)
    for row in dictcity.items():
        if len(dictcity[row[0]]) < lenrow:
            dictcity[row[0]] = dictcity[row[0]] + [''] * (lenrow - len(dictcity[row[0]]))
           
    # транспонируем матрицу, чтобы значения были под колонкой города      
    transpose_matrix = [[list(dictcity.values())[j][i] for j in range(len(list(dictcity.values())))]
                                                       for i in range(len(list(dictcity.values())[0]))]

   
# создаем файл и записываем в него нашу новую таблицу      
with open('города_new.csv', 'w', newline='\n',encoding='utf8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(list(dictcity.keys()))
    for values in transpose_matrix:
        writer.writerow(values)
Спасибо большое!
[/QUOTE]
 

Форум IT Специалистов