#python #pandas #dataframe
Вопрос:
У меня есть много разных таблиц, все они имеют разные имена столбцов, и каждая из них относится к результату, такому как глюкоза, инсулин, лептин и т. Д. (За исключением того, что имейте в виду, что все таблицы гигантские и беспорядочные с множеством других столбцов в них).
Я пытаюсь создать отчет, который начинается с пустого, но затем добавляет столбцы на основе функций, применяемых к каждой из таблиц глюкозы, инсулина и лептина.
Я привел очень простой пример — игнорируйте, что функция имеет мало смысла. Приведенный ниже код работает, но я хотел бы, вместо того, чтобы копировать вставлять final_report[«результат»] = снова и снова, просто запустите функцию find_result для каждой глюкозы, инсулина и лептина и добавьте «glucose_result», «insulin_result» и «leptin_result» в final_report в одной или нескольких строках.
Заранее спасибо.
import pandas as pd ids = [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,4,4,4,4,4,4] timepoint = [1,2,3,4,5,6,1,2,3,4,5,6,1,2,4,1,2,3,4,5,6] outcome = [2,3,4,5,6,7,3,4,1,2,3,4,5,4,5,8,4,5,6,2,3] glucose = pd.DataFrame({'id':ids, 'timepoint':timepoint, 'outcome':outcome}) insulin = pd.DataFrame({'id':ids, 'timepoint':timepoint, 'outcome':outcome}) leptin = pd.DataFrame({'id':ids, 'timepoint':timepoint, 'outcome':outcome}) ids = [1,2,3,4] start = [1,1,1,1] end = [6,6,6,6] final_report = pd.DataFrame({'id':ids, 'start':start, 'end':end}) def find_result(subject, start, end, df): df = df.loc[(df["id"] == subject) amp; (df["timepoint"] gt;= start) amp; (df["timepoint"] lt;= end)].sort_values(by = "timepoint") return df["timepoint"].nunique() final_report['glucose_result'] = final_report.apply(lambda x: find_result(x['id'], x['start'], x['end'], glucose), axis=1) final_report['insulin_result'] = final_report.apply(lambda x: find_result(x['id'], x['start'], x['end'], insulin), axis=1) final_report['leptin_result'] = final_report.apply(lambda x: find_result(x['id'], x['start'], x['end'], leptin), axis=1)
Ответ №1:
Если вам нужно использовать эту структуру кода, вы можете создать простой словарь с вашими кадрами данных и их именами и просмотреть их, создавая новые столбцы с программно назначенными именами:
input_dfs = {"glucose": glucose, "insulin": insulin, "leptin": leptin} for name, df in input_dfs.items(): final_report[f"{name}_result"] = final_report.apply( lambda x: find_result(x['id'], x['start'], x['end'], df), axis=1 )
Выход:
id start end glucose_result insulin_result leptin_result 0 1 1 6 6 6 6 1 2 1 6 6 6 6 2 3 1 6 3 3 3 3 4 1 6 6 6 6