это ограничения
Имя столбца
Описание
user_id
Уникальный идентификатор для каждого пользователя. не должно быть пропущенных значений.
дата
Дата данных о состоянии здоровья было записано или была принята добавка, в формате даты. Пропущенных значений быть не должно.
электронная почта
Контактный адрес электронной почты пользователь. Пропущенных значений быть не должно.
user_age_group
Возрастная группа пользователь, один из: «Младше 18», «18–25», «26–35», «36–45», «46–55», «56–65», «Старше 65» или «Неизвестно», где возраст отсутствует.
experiment_name
Название эксперимента, связанного с использование дополнений. Допускаются отсутствующие значения для пользователей, у которых есть только данные о состоянии здоровья.
supplement_name
Название добавки, принятой в тот день. Допускаются множественные записи. Дни без приема добавок должны быть закодированы как «Нет приема».
dosage_gramsДозировка добавки в граммах. Если дозировка указана в мг, ее следует преобразовать путем деления на 1000. Допускаются пропущенные значения для дней без приема добавок.
< td>is_placebo
Указывает, была ли добавка плацебо (истина/ложь). Допускаются отсутствующие значения для дней без приема добавки.
average_heart_rate
Средняя частота пульса, зафиксированная носимым устройством. Отсутствующие значения допускаются.
средняя_глюкоза
Средний уровень глюкозы, зафиксированный на носимом устройстве. Отсутствующие значения допускаются.
sleep_hours
Общее время сна в часах за ночь, предшествующую журналу текущего дня. Допускаются пропущенные значения.
activity_level
Оценка уровня активности от 0 до 100. .Допускаются пропущенные значения.
после проверки столбцов типы, которые он отображает следующим образом, которые соответствуют требованию
user_id
объект
дата
datetime64[ns]
электронная почта
объект
user_age_group
категория
имя_эксперимента
объект
имя_дополнения
объект
dosage_grams
float64
is_placebo
bool
average_heart_rate
< td>float64
средняя_глюкоза
float64
sleep_hours
float64
уровень_активности
int64
но результат после отправки был таким
- Определение, запись и выполнение функций. ОК
- Интерпретируйте схему базы данных и объединяйте несколько таблиц по строкам или столбцам. Ошибка
- Определить и заменить пропущенные значения Не удалось
- Очистка категориальных и текстовых данных путем манипулирования строками. Не удалось
- Преобразуйте значения между типами данных. Ошибка
После следования рекомендациям.
Я написал функцию merge_all_data(), которая обрабатывает эти изменения. ограничения.
- сгруппируйте группу user_age_group
- очистите Sleep_hours, чтобы она стала плавающей, и удалите строку hH в столбце
- удалить данные из user_health_data_df, чтобы убедиться, что у них есть данные о состоянии здоровья
- агрегировать, чтобы найти дозировку
- объединить их все вместе, чтобы получить все необходимые столбцы
- удалить ненужные столбцы
- преобразовать тип данных date в datetime и is_placebo в bool
- Обеспечить уникальные ежедневные записи
- Изменить порядок столбцов
Код: Выделить всё
import pandas as pd
import numpy as np
def merge_all_data(user_health_file, supplement_usage_file, experiments_file, user_profiles_file):
user_profiles_df = pd.read_csv(user_profiles_file)
user_health_data_df = pd.read_csv(user_health_file)
supplement_usage_df = pd.read_csv(supplement_usage_file)
experiments_df = pd.read_csv(experiments_file)
# Age Grouping
bins = [0, 17, 25, 35, 45, 55, 65, np.inf]
labels = ['Under 18', '18-25', '26-35', '36-45', '46-55', '56-65', 'Over 65']
user_profiles_df['user_age_group'] = pd.cut(user_profiles_df['age'], bins=bins, labels=labels, right=False)
user_profiles_df['user_age_group'] = user_profiles_df['user_age_group'].cat.add_categories('Unknown').fillna('Unknown')
user_profiles_df.drop(columns=['age'], inplace=True)
user_health_data_df['sleep_hours'] = user_health_data_df['sleep_hours'].str.replace('[hH]', '', regex=True).astype(float)
# Supplement Usage Data
supplement_usage_df['dosage_grams'] = supplement_usage_df['dosage'] / 1000
supplement_usage_df['is_placebo'] = supplement_usage_df['is_placebo'].astype(bool)
supplement_usage_df.drop(columns=['dosage', 'dosage_unit'], inplace=True)
# Merging Data
merged_df = pd.merge(user_profiles_df, user_health_data_df, on='user_id', how='left')
merged_df = pd.merge(merged_df, supplement_usage_df, on=['user_id', 'date'], how='left')
merged_df = pd.merge(merged_df, experiments_df, on='experiment_id', how='left')
# Filling Missing Values
merged_df['supplement_name'].fillna('No intake', inplace=True)
merged_df['dosage_grams'] = merged_df['dosage_grams'].where(merged_df['supplement_name'] != 'No intake', np.nan)
# Drop Unnecessary Columns
merged_df.drop(columns=['experiment_id', 'description'], inplace=True)
# Rename and Format Date
merged_df.rename(columns={'name': 'experiment_name'}, inplace=True)
merged_df['date'] = pd.to_datetime(merged_df['date'], errors='coerce')
merged_df['is_placebo'] = merged_df['is_placebo'].astype(bool)
# Ensure Unique Daily Entries
merged_df = merged_df.groupby(['user_id', 'date']).first().reset_index()
# Reorder Columns
new_order = ['user_id', 'date', 'email', 'user_age_group', 'experiment_name',
'supplement_name', 'dosage_grams', 'is_placebo',
'average_heart_rate', 'average_glucose', 'sleep_hours', 'activity_level']
merged_df = merged_df[new_order]
return merged_df
# Example usage
merged_df = merge_all_data('user_health_data.csv', 'supplement_usage.csv', 'experiments.csv', 'user_profiles.csv')
Я также используйте .isnull().sum() для поиска нулевых значений
user_id
0
дата
0
электронная почта
0
user_age_group
0
имя_эксперимента
721< /td>
имя_дополнения
0
dosage_grams
721
is_placebo
0
average_heart_rate
0
среднее_глюкоза
0
sleep_hours
0
< tr>
уровень_активности
0
Подробнее здесь: https://stackoverflow.com/questions/790 ... p-datacamp