Проще говоря, мне нужно преобразовать следующий входной фрейм данных в вывод ниже.
После нескольких часов попыток выяснить, как, комбинируя несколько предыдущих вопросов о стековом потоке, я мог преобразовать фрейм данных, но преобразование большого фрейма данных занимает очень много времени, так как я использую метод pivot и apply.
import numpy as np
import pandas as pd
df = pd.DataFrame({"id":[1,2,3,4,5],
"day":pd.Timestamp('20190529'),
"subject":"math,english,economics",
"score":pd.Categorical(["68,62,49","58,72,87","28,32,46","48,72,66","46,25,93"]),
"Department":pd.Categorical(["Economics","Computer Science","Sociology","Business","Math"])})
---Input DataFrame---
id day subject score Department
0 1 2019-05-29 math,english,economics 68,62,49 Economics
1 2 2019-05-29 math,economics 58,87 Computer Science
2 3 2019-05-29 philosophy,english,business 28,32,46 Sociology
3 4 2019-05-29 physics,sociology 72,66 Business
4 5 2019-05-29 Math 93 Math
И вывод похож на тот, что показан ниже
---Output DataFrame---
id day Department Math business economics english math philosophy physics sociology
1 2019-05-29 Economics NaN NaN 49 62 68 NaN NaN NaN
2 2019-05-29 Computer Science NaN NaN 87 NaN 58 NaN NaN NaN
3 2019-05-29 Sociology NaN 46 NaN 32 NaN 28 NaN NaN
4 2019-05-29 Business NaN NaN NaN NaN NaN NaN 72 66
5 2019-05-29 Math 93 NaN NaN NaN NaN NaN NaN NaN
И мой подход -
- Я делю столбцы темы и оценки на ','.
- Разнесите список элементов в столбцах темы и оценки, чтобы разделить строку как pandas.Series
- Присоединитесь к каждому pandas.Series, чтобы создать новый фрейм данных
- Повернуть новый фрейм данных, созданный на шаге 3
- Удалите столбец темы и оценки в исходном фрейме данных
- Соедините каждый фрейм данных, созданный на шаге 4 и шаге 5
И мой код выглядит следующим образом
df["subject"] = df["subject"].str.split(",")
df["score"] = df["score"].str.split(",")
subject = df.apply(lambda x: pd.Series(x['subject']),axis=1).stack().reset_index(level=1, drop=True)
score = df.apply(lambda x: pd.Series(x['score']),axis=1).stack().reset_index(level=1, drop=True)
subject.name = 'subject'
score.name = 'score'
subject_score = pd.concat([subject, score],join='outer', axis=1)
pdf = df.drop('subject', axis=1).drop("score", axis=1).join(subject_score)
pivot = pdf.pivot(columns="subject",values="score")
concate_table = df.drop("subject",axis = 1).drop("score", axis=1)
output = concate_table.join(pivot)
Я только недавно начал изучать панд, и я уверен, что это не лучший способ перестановки столбцов.
Если бы вы могли дать мне несколько советов, как оптимизировать этот код, я ценю.
Заранее спасибо.