как это считать и вывести из файла csv?
у меня есть файл studens.csv. мне нужно считат данные из файла и вывести информацию:
1.Определите количество девушек и количество мальчиков в группе
Определите средний возраст девушек и парней в своей группе, предварительно уточнив его в базе студентов.
Найдите парня / девушку с самым длинным именем. выбор критерия поиска парень / девушка ввести с консоли
я знаю как это делать с готовым списком но не знаю как это считать и вывести из файла вот код для готового списка
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 шт):
Конечно, это как-то "неверно", но в итоге список с объектами, в каждом из которых есть атрибуты: 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)
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
парень с самым длинным именем: Рендович Руслан-Ігор Русланович
девушка с самым длинным именем: Река Наталія-Василина Андріївна