как это считать и вывести из файла csv?

у меня есть файл studens.csv. мне нужно считат данные из файла и вывести информацию:

1.Определите количество девушек и количество мальчиков в группе

  1. Определите средний возраст девушек и парней в своей группе, предварительно уточнив его в базе студентов.

  2. Найдите парня / девушку с самым длинным именем. выбор критерия поиска парень / девушка ввести с консоли

я знаю как это делать с готовым списком но не знаю как это считать и вывести из файла вот код для готового списка

import pandas as pd
import numpy as np
my_string = "Ф; И; О; возраст; категория; Глушов Ирина Андреевна; 18 лет Студент 1 курса; Иванов Степан Владимирович; 18 лет Студент 1 курса; Петровая Софья Александровна; 18 лет студент 1 курса; Дзюба Олег Викторович; 18 лет Студент 1 курса; Река Наталия Андреевна; 18 лет Студент 1 курса; Сигловийчик Иван Богданович; 18 лет Студент 1 курса; Сологуб Ростислав Андреевич; 18 лет Студент 1 курса"
tmp = my_string.split('; ')
colum = tmp[:5]
dct = dict()
for i in range(5, len(tmp), 2):
    t1 = tmp[i].split()
    t2 = tmp[i+1].split(' ', 2)
    t1.extend([t2[0], t2[2]])
    for i, key in enumerate(colum):
        dct.setdefault(key, []).append(t1[i])
 
data = pd.DataFrame(dct)
data['возраст'] = data['возраст'].astype(int)
print(data)
print()
 
mask_girl = data['О'].map(lambda x: x.endswith('на'))
mask_guy = data['О'].map(lambda x: x.endswith('ич'))
 
print('количество девушек')
print(data[mask_girl].shape[0])
print()
 
print('количество юношей')
print(data[mask_guy].shape[0])
print()
 
print('средний возраст девушек')
print(data[mask_girl]['возраст'].mean())
print()
 
print('средний возраст юношей')
print(data[mask_guy]['возраст'].mean())
print()
 
df_tmp = data[mask_guy]['И']
print('парень с самым длинным именем')
print(df_tmp[df_tmp.map(len) >= df_tmp.map(len).max()].values[0])
print()
 
df_tmp = data[mask_girl]['И']
print('девушка с самым длинным именем')
print(df_tmp[df_tmp.map(len) >= df_tmp.map(len).max()].values[0])

Сылка на файл student.csv http://file.sampo.ru/4rsw4q/


Ответы (2 шт):

Автор решения: Leonid

Конечно, это как-то "неверно", но в итоге список с объектами, в каждом из которых есть атрибуты: number, name, age, group. Я думаю дальше можно обработать по каждым отдельным пунктам.

Подскажите, пожалуйста, как изящней получить данные словаря, где ключ '№ ;фио;Возраст;Група', а значение - нужные данные, разделенные ;

import csv

class Student:
    def __init__(self, number, name, age, group):
        self.number = number
        self.name = name
        self.age = age
        self.group = group

with open('file.csv', newline='', encoding='utf8') as csvfile:
    reader = csv.DictReader(csvfile)
    students = []
    for item in reader:
        students.append(Student(*item['№ ;фио;Возраст;Група'].split(';')))

print(students)
→ Ссылка
Автор решения: strawdog
import pandas as pd
import numpy as np

df = pd.read_csv("studens.csv", sep=";")

df["пол"] = np.where(df["фио"].str.endswith("на"), "Женский", "Мужской")
df["имя"] = df["фио"].apply(lambda x: x.split(" ")[1])

print('количество девушек: ', len(df[df["пол"]=="Женский"]))
print('количество юношей: ', len(df[df["пол"]=="Мужской"]))
 
print('средний возраст девушек: ', df.loc[df["пол"]=="Женский", "Возраст"].mean())
print('средний возраст юношей: ', df.loc[df["пол"]=="Мужской", "Возраст"].mean()) 

df = df.sort_values(by='имя', key=lambda x: x.str.len())
print('парень с самым длинным именем: ', df.loc[df["пол"]=="Мужской", "фио"].tail(1).values[0])
print('девушка с самым длинным именем: ', df.loc[df["пол"]=="Женский", "фио"].tail(1).values[0])

получаем:

количество девушек:  5
количество юношей:  14
средний возраст девушек:  18.0
средний возраст юношей:  18.0
парень с самым длинным именем:  Рендович Руслан-Ігор Русланович
девушка с самым длинным именем:  Река Наталія-Василина Андріївна
​
→ Ссылка