Табличные вычисления в Python: задача на анализ успеваемости
Цель задачи и основные подходы
Рассматривается типичная учебная задача: имеется файл students.csv с колонками Имя, Оценка1, Оценка2, Оценка3. Требуется вычислить среднюю оценку каждого студента и общий средний балл по всем оценкам, после чего вывести результаты в порядке убывания средней оценки. Ниже представлены различные способы решения с использованием разных библиотек и подходов.
Как эффективно решить задачу с помощью pandas?
Библиотека pandas предоставляет наиболее лаконичный и быстрый способ работы с табличными данными. Она автоматически обрабатывает заголовки, типы данных и пропуски.
import pandas as pd
df = pd.read_csv('students.csv')
df['Средняя'] = df[['Оценка1','Оценка2','Оценка3']].mean(axis=1)
result = df[['Имя','Средняя']].sort_values('Средняя', ascending=False)
print(result)
print('Общий средний балл:', df['Средняя'].mean())
библиотека таблиц python (библиотека для работы с таблицами в python)
Имя Средняя
3 Иван 4.666667
1 Мария 4.333333
0 Петр 3.666667
2 Анна 3.333333
Общий средний балл: 4.0
Python вывести таблицу (вывод таблицы в python)
Возможные проблемы:
- Файл не найден (проверьте путь).
- Разное количество разделителей (используйте опцию
sep). - Пропущенные значения (pandas по умолчанию игнорирует NaN, но в mean можно добавить
skipna=False).
Типичная ошибка: если в столбцах есть нечисловые данные, mean вызовет ошибку. Решение: предварительно преобразовать типы через pd.to_numeric.
Как решить задачу без внешних библиотек, используя встроенный модуль csv?
Модуль csv позволяет читать файл построчно и самостоятельно управлять преобразованием данных. Этот подход полезен, когда нужно минимизировать зависимости.
import csv
students = []
with open('students.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
name = row['Имя']
grades = [float(row['Оценка1']), float(row['Оценка2']), float(row['Оценка3'])]
avg = sum(grades) / len(grades)
students.append((name, avg))
students.sort(key=lambda x: x[1], reverse=True)
for name, avg in students:
print(f'{name}: {avg:.2f}')
total_avg = sum(s[1] for s in students) / len(students)
print(f'Общий средний балл: {total_avg:.2f}')
таблица python задача (задача на таблицу в python)
Иван: 4.67 Мария: 4.33 Петр: 3.67 Анна: 3.33 Общий средний балл: 4.00
Python работа с таблицами (работа с таблицами в python)
Проблемы и их решение:
- Пропуск строк с некорректными данными: оберните преобразование в try-except.
- Разделитель не запятая: укажите
delimiterпри создании reader. - Кодировка: если файл в cp1251, измените
encoding.
Как работать с таблицей из Excel-файла с помощью openpyxl?
Если источник данных - файл Excel (xlsx), удобно использовать openpyxl. Он позволяет читать ячейки по именам или координатам.
import openpyxl
wb = openpyxl.load_workbook('students.xlsx')
ws = wb.active
students = []
for row in ws.iter_rows(min_row=2, values_only=True): # пропускаем заголовок
name = row[0]
grades = [float(row[1]), float(row[2]), float(row[3])]
avg = sum(grades) / len(grades)
students.append((name, avg))
students.sort(key=lambda x: -x[1])
for name, avg in students:
print(f'{name}: {avg:.2f}')
total_avg = sum(a for _, a in students) / len(students)
print(f'Общий средний балл: {total_avg:.2f}')
Python создание таблиц (создание таблиц в python)
Иван: 4.67 Мария: 4.33 Петр: 3.67 Анна: 3.33 Общий средний балл: 4.00
сортировка столбца python (сортировка столбца в python)
Типичные сложности:
- Пустые ячейки: проверяйте значение перед преобразованием.
- Файл защищен паролем: openpyxl не сможет открыть без пароля.
- Большие файлы: используйте
read_only=Trueдля экономии памяти.
Как решить задачу с помощью ручного чтения строк и split?
Самый базовый способ - открыть файл, прочитать строки, разбить по разделителю. Подходит для быстрых скриптов без импорта дополнительных модулей.
with open('students.csv', 'r', encoding='utf-8') as f:
lines = f.readlines()
header = lines[0].strip().split(',')
data = []
for line in lines[1:]:
parts = line.strip().split(',')
name = parts[0]
grades = list(map(float, parts[1:]))
avg = sum(grades) / len(grades)
data.append((name, avg))
data.sort(key=lambda x: -x[1])
for name, avg in data:
print(f'{name}: {avg:.2f}')
print(f'Общий средний балл: {sum(a for _,a in data)/len(data):.2f}')
Python столбец таблицы (столбец таблицы в python)
Иван: 4.67 Мария: 4.33 Петр: 3.67 Анна: 3.33 Общий средний балл: 4.00
Ошибки и ограничения:
- Строка может содержать запятые внутри кавычек (разбиение некорректно). В таких случаях используйте
csv. - Пустые строки в конце файла: проверяйте
if line.strip(). - Несоответствие количества столбцов: обрабатывайте исключением.
Расширенные примеры и нестандартные сценарии
1. Группировка и агрегация с pandas
Предположим, есть данные о продажах (sales.csv): Дата, Товар, Количество, Цена. Нужно найти общую выручку по каждому товару за месяц.
import pandas as pd
df = pd.read_csv('sales.csv')
df['Дата'] = pd.to_datetime(df['Дата'])
df['Месяц'] = df['Дата'].dt.month_name()
grouped = df.groupby(['Товар', 'Месяц'])['Цена'].sum() * df.groupby(['Товар', 'Месяц'])['Количество'].sum()
# Альтернатива: df['Выручка'] = df['Количество'] * df['Цена']
# grouped = df.groupby(['Товар', 'Месяц'])['Выручка'].sum()
print(grouped)
Товар Месяц
Апельсины Март 1500.0
Апрель 2000.0
Яблоки Март 1200.0
Апрель 1800.0
Name: Выручка, dtype: float64
2. Чтение большого CSV с обработкой по чанкам
Когда файл не помещается в память, pandas позволяет читать по частям.
import pandas as pd
chunk_size = 10000
result = []
for chunk in pd.read_csv('huge_data.csv', chunksize=chunk_size):
chunk['total'] = chunk['col1'] + chunk['col2']
result.append(chunk['total'].mean())
overall_mean = sum(result) / len(result)
print('Среднее по всем чанкам:', overall_mean)
3. Создание таблицы на лету и запись в разные форматы
Иногда необходимо сгенерировать таблицу из данных API и сохранить в Excel или JSON.
import pandas as pd
data = [
{'Город': 'Москва', 'Население': 12_000_000},
{'Город': 'Санкт-Петербург', 'Население': 5_400_000}
]
df = pd.DataFrame(data)
df.to_excel('cities.xlsx', index=False)
df.to_json('cities.json', orient='records', force_ascii=False)
print('Файлы сохранены.')
4. Фильтрация строк по нескольким условиям без pandas
Используя модуль csv и list comprehension.
import csv
with open('students.csv', 'r') as f:
reader = csv.DictReader(f)
filtered = [row for row in reader if float(row['Оценка1']) >= 4 and float(row['Оценка3']) >= 3]
for row in filtered:
print(row['Имя'])
5. Использование numpy для численных операций над таблицей
Если таблица представлена как массив, можно быстро вычислять средства.
import numpy as np
import csv
data = []
with open('students.csv', 'r') as f:
reader = csv.reader(f)
next(reader) # пропускаем заголовок
for row in reader:
data.append([float(x) for x in row[1:]])
arr = np.array(data)
mean_per_student = arr.mean(axis=1)
mean_overall = arr.mean()
print('Средние по студентам:', mean_per_student)
print('Общий средний балл:', mean_overall)