Загрузка данных


# Лабораторная работа №2
# Выполнение операций над объектом DataFrame и его содержимым

# ==========================================
# Задание 1. Импорт библиотек и создание DataFrame
# ==========================================

import numpy as np
import pandas as pd

data = {
    'Name': ['Иван Петров', 'Мария Соколова', 'Петр Сидоров', 'Анна Козлова', 'Олег Смирнов'],
    'Department': ['IT', 'HR', 'IT', 'Finance', 'HR'],
    'Salary': [75000, 65000, 82000, 71000, 69000],
    'Experience': [3, 5, 7, 2, 4]
}

df = pd.DataFrame(data)

print("Исходный DataFrame:")
print(df)


# ==========================================
# Задание 2. Переименование столбцов
# ==========================================

df_renamed = df.rename(columns={
    'Name': 'name',
    'Department': 'dept',
    'Salary': 'salary',
    'Experience': 'exp'
})

print("\nrename() с копией:")
print(df_renamed)

df.rename(columns={
    'Name': 'name',
    'Department': 'dept',
    'Salary': 'salary',
    'Experience': 'exp'
}, inplace=True)

print("\nrename(inplace=True):")
print(df)

df.columns = ['name', 'dept', 'salary', 'exp']

print("\nПрямое присваивание:")
print(df)


# ==========================================
# Задание 3. Добавление столбцов
# ==========================================

df['bonus'] = df['salary'] * 0.1

df['city'] = ['Москва', 'Санкт-Петербург', 'Москва', 'Казань', 'Новосибирск']

df.insert(2, 'gender', ['M', 'F', 'M', 'F', 'M'])

new_columns = pd.DataFrame({
    'birth_year': [1990, 1988, 1985, 1992, 1989],
    'phone': [
        '+7-901-123-45-67',
        '+7-902-234-56-78',
        '+7-903-345-67-89',
        '+7-904-456-78-90',
        '+7-905-567-89-01'
    ]
})

df = pd.concat([df, new_columns], axis=1)

print("\nПосле добавления столбцов:")
print(df)


# ==========================================
# Задание 4. Удаление столбцов
# ==========================================

df.drop('phone', axis=1, inplace=True)

df.drop(['bonus', 'birth_year'], axis=1, inplace=True)

df = df.drop(['city'], axis=1)

print("\nПосле удаления столбцов:")
print(df)


# ==========================================
# Задание 5. Добавление строк
# ==========================================

df.loc[len(df)] = ['Елена Новикова', 'IT', 'F', 95000, 6]

new_rows = pd.DataFrame({
    'name': ['Дмитрий Волков', 'Татьяна Морозова'],
    'dept': ['Finance', 'HR'],
    'gender': ['M', 'F'],
    'salary': [88000, 72000],
    'exp': [8, 3]
})

df = pd.concat([df, new_rows], ignore_index=True)

print("\nПосле добавления строк:")
print(df)


# ==========================================
# Задание 6. Конкатенация строк
# ==========================================

df['full_info'] = (
    df['name'] + ' (' +
    df['dept'] + ') - стаж: ' +
    df['exp'].astype(str) + ' лет'
)

df['name_dept'] = df['name'].str.cat(df['dept'], sep=' | ')

df.drop('full_info', axis=1, inplace=True)

print("\nПосле объединения строк:")
print(df)


# ==========================================
# Задание 7. Замена значений
# ==========================================

df['exp'] = df['exp'] + 1

df.loc[df['dept'] == 'IT', 'salary'] = df.loc[df['dept'] == 'IT', 'salary'] * 1.1

condition = (df['salary'] < 80000) & (df['exp'] > 4)

df.loc[condition, 'salary'] = df.loc[condition, 'salary'] + 5000

df['bonus_flag'] = np.where(df['exp'] > 5, 'Senior', 'Junior')

print("\nПосле изменений:")
print(df)


# ==========================================
# Задание 8. Удаление строк
# ==========================================

df.drop(0, axis=0, inplace=True)

df = df[df['salary'] >= 80000].copy()

indices_to_drop = [2, 4]

existing_indices = [i for i in indices_to_drop if i in df.index]

df.drop(existing_indices, axis=0, inplace=True)

print("\nПосле удаления строк:")
print(df)


# ==========================================
# Задание 9. Сброс индекса
# ==========================================

df.reset_index(drop=True, inplace=True)

print("\nПосле сброса индекса:")
print(df)


# ==========================================
# Задание 10. Логический отбор
# ==========================================

selected = df.loc[df['dept'] == 'HR', ['name', 'salary', 'exp']]

print("\nСотрудники HR:")
print(selected)

first_three = df.iloc[:3, [0, 1, 3]]

print("\nПервые 3 строки:")
print(first_three)

avg_salary = df['salary'].mean()

high_earners = df.loc[df['salary'] > avg_salary, ['name', 'dept', 'salary']]

print("\nЗарплата выше средней:")
print(high_earners)


# ==========================================
# Задание 11. Сохранение и загрузка
# ==========================================

df.to_csv('employees_modified.csv', index=False, encoding='utf-8')

print("\nФайл сохранён")

df_loaded = pd.read_csv('employees_modified.csv')

print("\nЗагруженный DataFrame:")
print(df_loaded)

print("\nСовпадение:", df.equals(df_loaded))


# ==========================================
# Дополнительное задание
# ==========================================

dept_stats = df.groupby('dept').agg({
    'salary': ['mean', 'min', 'max'],
    'exp': 'mean'
}).round(0)

print("\nСтатистика по отделам:")
print(dept_stats)

dept_stats.to_csv('department_stats.csv')

print("\nФайл статистики сохранён")