Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 23.02.2024
Сообщений: 4

Задача библиотека Pandas

19.04.2024, 19:17. Показов 835. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не получается решить задачу на Python.
Условие:
файле input.csv дана таблица с информацией о работе водителей склада №7:
Code
1
2
3
4
5
6
7
8
9
10
ID  Фамилия водителя Объем груза   Тип операции
1   Уточкин  2726                                      Вывоз
2   Петров    3581                                      Привоз
3   Сидоров  3724                                      Привоз
4   Петров    2683                                      Привоз
5   Иванов    1637                                      Вывоз
6   Уточкин  3836                              Вывоз
7   Ёжкин  3055                                      Привоз
8   Иванов    3220                                      Привоз
9   Сидоров  2584                              Вывоз
Необходимо вычислить по каждому водителю сколько килограмм суммарно груза он привёз за вычетом суммарного веса вывезенного груза. Итоговую таблицу отсортировать по убыванию этой суммы, а при равенстве её для двух водителей — по возрастанию фамилий водителей (в лексикографическом порядке). Сохранить в формате CSV в файл output.csv.
Пример:
Ввод:
Code
1
2
3
4
5
6
7
8
9
10
ID,Фамилия водителя, Объем груза, Тип операции
1,Уточкин,2726,Вывоз
2,Петров,3581,Привоз
3,Сидоров,3724,Привоз
4,Петров,2683,Привоз
5,Иванов,1637,Вывоз
6,Уточкин,3836,Вывоз
7,Ежкин,3055,Привоз
8,Иванов,3220,Привоз
9,Сидоров,2584,Вывоз
Вывод:
Code
1
2
3
4
5
6
Фамилия водителя, Объем груза
Петров,6264
Ежкин,3055
Иванов,1583
Сидоров,1140
Уточкин,-6562
Примечания:
Обратите внимание, что в файле input.csv может вообще не быть никакой информации (только названия колонок). В этом случае в output.csv также нужно сохранить только названия колонок (DataFrame.to_csv() также может корректно это выполнить без указания дополнительных параметров).
В результирующей таблице названия столбцов следует записать на русском языке, поэтому в DataFrame.to_csv() следует дополнительно указать параметр: encoding="utf8".

Вот код, который у меня получился, но система его не принимает:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
 
data = pd.read_csv("input.csv", encoding="utf-8")
 
 
if len(data) == 0:
 
    data.to_csv("output.csv", index=False, encoding="utf-8")
else:
 
    grouped_data = data.groupby('Фамилия водителя')['Объем груза'].sum()
 
    grouped_data_out = data[data['Тип операции'] == 'Вывоз'].groupby('Фамилия водителя')['Объем груза'].sum()
 
    result = grouped_data.subtract(grouped_data_out, fill_value=0)
 
    result_sorted = result.sort_values(ascending=False).reset_index()
 
    result_sorted.columns = ['Фамилия водителя', 'Объем груза']
    result_sorted.to_csv("output.csv", index=False, encoding="utf-8")
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2024, 19:17
Ответы с готовыми решениями:

Задача с библиотекой pandas
Необходимо создать Data Frame c колонками , заполненный случайными числами. Data Frame должен иметь 30 строк. Элементы в колонке A могут...

Задача с использованием pandas и numpy
Есть файл в экселе, есть задача: Файл - football.csv: Во сколько раз средняя сила удара(ShotPower) игроков с максимальным значением...

DeprecationWarning: Pyarrow will become a required dependency of pandas in the next major release of pandas
Возникла проблема при импортировании модуля Pandas. При запуске кода выдает следующее: DeprecationWarning: Pyarrow will become a...

8
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
19.04.2024, 20:06
Цитата Сообщение от MPboi30 Посмотреть сообщение
grouped_data = data.groupby('Фамилия водителя')['Объем груза'].sum()
Если не суммировать "Привоз" с "Вывозом"
Python
1
2
3
...
    grouped_data = data[data['Тип операции'] == 'Привоз'].groupby('Фамилия водителя')['Объем груза'].sum()
...
то всё должно получиться...
2
0 / 0 / 0
Регистрация: 23.02.2024
Сообщений: 4
19.04.2024, 20:21  [ТС]
К сожалению, все равно не выходит, но спасибо!
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
19.04.2024, 20:50
Цитата Сообщение от MPboi30 Посмотреть сообщение
К сожалению, все равно не выходит
Не выходит что? Файл проверяли на выходе?
Возможно тип данных не тот, который требуется
Python
1
result_sorted['Объем груза'] = result_sorted['Объем груза'].astype(int)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.04.2024, 21:47
Python
1
2
3
4
5
6
7
8
9
10
11
 import pandas as pd
import numpy as np
 
s = [[1, 'Уточкин', 2726, 'Вывоз'], [2, 'Петров', 3581, 'Привоз'], [3, 'Сидоров', 3724, 'Привоз'], [4, 'Петров', 2683, 'Привоз'], [5, 'Иванов', 1637, 'Вывоз'], [6, 'Уточкин', 3836, 'Вывоз'], [7, 'Ёжкин', 3055, 'Привоз'], [8, 'Иванов', 3220, 'Привоз'], [9, 'Сидоров', 2584, 'Вывоз']]
df = pd.DataFrame(s, columns=['ID', 'Фамилия водителя', 'Объем груза', 'Тип операции'])
 
df['Объем груза'] = np.where(df['Тип операции']=='Привоз', df['Объем груза'], -df['Объем груза'])
df_group = df.groupby('Фамилия водителя')['Объем груза'].sum()\
            .reset_index()\
            .sort_values(['Объем груза', 'Фамилия водителя'], ascending=( False , True ))
df_group
3
0 / 0 / 0
Регистрация: 23.02.2024
Сообщений: 4
20.04.2024, 11:42  [ТС]
Правильное решение:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
 
data = pd.read_csv("input.csv", encoding="utf=8")
 
out_data = {}
 
for _, row in data.iterrows():
    if row["Тип операции"] == "Привоз":
        if row["Фамилия водителя"] in out_data:
            out_data[row["Фамилия водителя"]] += row["Объем груза"]
        else:
            out_data[row["Фамилия водителя"]] = row["Объем груза"]
    else:
        if row["Фамилия водителя"] in out_data:
            out_data[row["Фамилия водителя"]] -= row["Объем груза"]
        else:
            out_data[row["Фамилия водителя"]] = -row["Объем груза"]
 
out_df = pd.DataFrame({"Фамилия водителя": list(out_data.keys()), "Объем груза": list(out_data.values())})
out_df.sort_values(by="Объем груза", ascending=False, inplace=True)
out_df.to_csv("output.csv", encoding="utf-8", index=False)
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
20.04.2024, 15:41
Цитата Сообщение от MPboi30 Посмотреть сообщение
Правильное решение
У Вас было нормальное решение, надо было только чуток довести его "до ума"...
Python
1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
 
data = pd.read_csv("input.csv", encoding="utf-8")
 
if len(data) == 0:
    data.to_csv("output.csv", index=False, columns=['Фамилия водителя','Объем груза'],encoding="utf-8")
else:
    gdatain = data[data['Тип операции'] == 'Привоз'].groupby('Фамилия водителя')['Объем груза'].sum()
    gdataout = data[data['Тип операции'] == 'Вывоз'].groupby('Фамилия водителя')['Объем груза'].sum()
    res = gdatain.sub(gdataout, fill_value=0).reset_index().sort_values('Объем груза',ascending=False)
    res['Объем груза'] = res['Объем груза'].astype(int)
    res.to_csv("output.csv", index=False, encoding="utf-8")
найдите 10 отличий в результате
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
21.04.2024, 09:45
Всё-таки pandas - отвратительная штука.

Решение на SQL:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH q AS (
    SELECT
        t."Фамилия водителя",
        SUM(CASE
            WHEN t."Тип операции" = 'Привоз' THEN t."Объем груза"
            ELSE -t."Объем груза" END
        ) AS "Объем груза"
    FROM
        INPUT.csv t
    GROUP BY
        t."Фамилия водителя"
)
SELECT
    q.*
FROM
    q
ORDER BY 
    q."Объем груза" DESC,
    q."Фамилия водителя"
В оракле чуть короче:

SQL
1
SUM(decode(t."Тип операции", 'Привоз', t."Объем груза", -t."Объем груза")) AS "Объем груза"
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
21.04.2024, 12:06
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Всё-таки pandas - отвратительная штука.
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Решение на SQL:
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
В оракле чуть короче:
- и всё это одновременно в разделе питона же
И почему pandas отвратительная? По-моему, так вполне функциональная штука, крути и вытворяй с данными, что хочешь... лишь бы фантазии хватило.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2024, 12:06
Помогаю со студенческими работами здесь

Библиотека Pandas
Библиотека Pandas: загрузить в рабочую среду данные датасета "Preferences" прочитать описание к данному датасету Написать скрипт,...

Библиотека Pandas
Помогите разобраться в этом вопросе Для заданного ниже объекта s типа Series проделайте следующее: Создайте новый Series, значения...

Библиотека pandas. Ошибка keyword can't be an expression
import pandas as pd import numpy as np data = pd.read_csv('tweets.csv') ... #Подсчитать и вывести кол-во сообщений со словом...

Удаление строки из DataFrame. Библиотека Pandas
Как из датафрейма удалить определенную строку, которая не соответствующую условию. Пример: Дан датафрейм в котором хранится такая...

Непонятная задача по Pandas
Добрый день занимаюсь на Яндекс Практикуме. И вот попалась мне задача с условием: "Сгруппируйте данные по столбцу 'month' и найдите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru