Создание столбцов из столбца, содержащего список словарей

У меня есть фрейм данных, в котором есть столбец со списком словарей, похожих на этот объект.

[{'MetricName': 'test:mean_wQuantileLoss',
  'Value': 1.0935583114624023,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6, tzinfo=tzlocal())},
 {'MetricName': 'train:loss:batch',
  'Value': 3.0625627040863037,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())},
 {'MetricName': 'train:progress',
  'Value': 100.0,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())},
 {'MetricName': 'train:loss',
  'Value': 3.2942464351654053,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())},
 {'MetricName': 'train:final_loss',
  'Value': 3.2942464351654053,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())},
 {'MetricName': 'train:throughput',
  'Value': 385.56353759765625,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())},
 {'MetricName': 'test:RMSE',
  'Value': 22.101428985595703,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6, tzinfo=tzlocal())},
 {'MetricName': 'ObjectiveMetric',
  'Value': 22.101428985595703,
  'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6, tzinfo=tzlocal())}]

Я хочу создать столбцы для каждого имени метрики и значения значения. У меня есть другие столбцы в фрейме данных, которые я также хочу сохранить. Как мне этого добиться?

Вот пример кадра данных

data = {'TrainingJobName': ['Training_JOB_NAME1'],
       'TrainingJobArn': ["Blahblah"],
       'FinalMetricDataList': ["[{'MetricName': 'test:mean_wQuantileLoss', 'Value': 1.0935583114624023, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6, tzinfo=tzlocal())}, {'MetricName': 'train:loss:batch', 'Value': 3.0625627040863037, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())}, {'MetricName': 'train:progress', 'Value': 100.0, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())}, {'MetricName': 'train:loss', 'Value': 3.2942464351654053, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())}, {'MetricName': 'train:final_loss', 'Value': 3.2942464351654053, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())}, {'MetricName': 'train:throughput', 'Value': 385.56353759765625, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37, tzinfo=tzlocal())}, {'MetricName': 'test:RMSE', 'Value': 22.101428985595703, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6, tzinfo=tzlocal())}, {'MetricName': 'ObjectiveMetric', 'Value': 22.101428985595703, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6, tzinfo=tzlocal())}]"]}
df_sample = pd.DataFrame(data=data)
df_sample.head()

Данные, о которых идет речь, находятся в 8 строках или в одной? Можете ли вы добавить образец данных DataFrame?

jezrael 27.08.2024 07:38

Минимально воспроизводимый пример должен содержать как исходные данные, так и желаемые результаты (пожалуйста, прочитайте ссылку)

MatBailie 27.08.2024 07:59

Могут ли разные строки в исходном кадре данных иметь разные метрики, требующие создания столбцов? Может ли строка 1 иметь имя метрики, не упомянутое в строке 2?

MatBailie 27.08.2024 08:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать DataFrame.explode для преобразования списка словарей в строки, json_normalize для новых столбцов, поворачивать их с помощью DataFrame.pivot и добавлять к существующим данным с помощью DataFrame.join:

import datetime as datetime

data = {'TrainingJobName': ['Training_JOB_NAME1'],
       'TrainingJobArn': ["Blahblah"],
       'FinalMetricDataList': [[{'MetricName': 'test:mean_wQuantileLoss', 'Value': 1.0935583114624023, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6)}, {'MetricName': 'train:loss:batch', 'Value': 3.0625627040863037, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37)}, {'MetricName': 'train:progress', 'Value': 100.0, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37)}, {'MetricName': 'train:loss', 'Value': 3.2942464351654053, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37)}, {'MetricName': 'train:final_loss', 'Value': 3.2942464351654053, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37)}, {'MetricName': 'train:throughput', 'Value': 385.56353759765625, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 44, 37)}, {'MetricName': 'test:RMSE', 'Value': 22.101428985595703, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6)}, {'MetricName': 'ObjectiveMetric', 'Value': 22.101428985595703, 'Timestamp': datetime.datetime(2022, 10, 20, 7, 45, 6)}]]}
df_sample = pd.DataFrame(data=data)
#print (df_sample)

df = df_sample.explode('FinalMetricDataList')
out = pd.json_normalize(df['FinalMetricDataList']).assign(idx = df.index.tolist())

out = df_sample.join(out.pivot(index='idx', columns='MetricName', values='Value'))
print (out)
0  Training_JOB_NAME1       Blahblah   

                                 FinalMetricDataList  ObjectiveMetric  \
0  [{'MetricName': 'test:mean_wQuantileLoss', 'Va...        22.101429   

   test:RMSE  test:mean_wQuantileLoss  train:final_loss  train:loss  \
0  22.101429                 1.093558          3.294246    3.294246   

   train:loss:batch  train:progress  train:throughput  
0          3.062563           100.0        385.563538  

У меня есть другие столбцы в фрейме данных, есть ли способ сохранить их в целости?

Wolfy 27.08.2024 07:52

@Wolfy - Можете ли вы добавить какой-нибудь пример, например df = pd.DataFrame({'col':[L], 'val':[45]})?

jezrael 27.08.2024 07:52

Просто отредактировал вопрос с образцом

Wolfy 27.08.2024 07:57

@Wolfy - данные находятся в строке в столбце FinalMetricDataList? Или они похожи на мой образец данных в отредактированном ответе?

jezrael 27.08.2024 08:03

Ну, это список,

Wolfy 27.08.2024 08:05

Это работает, но я, вероятно, создаю неправильный тип объекта.

Wolfy 27.08.2024 08:07

@wolfy "[{'x': 'y'}, {'a', 'b'}]" — это не список, это строка. В вашем вопросе в первом примере список не заключен в кавычки, а во втором - есть. Наличие кавычек или их отсутствие имеет значение. Имеет значение строка или список.

MatBailie 27.08.2024 08:10

Другие вопросы по теме