Добавление метаинформации/метаданных в pandas DataFrame
Можно ли добавить мета-информацию/метаданные в pandas DataFrame?
Например, имя инструмента, используемое для измерения данных, ответственного за инструмент и т.д.
Одним из способов было бы создать столбец с этой информацией, но кажется бесполезным хранить единый фрагмент информации в каждой строке!
Ответы
Ответ 1
Конечно, как и большинство объектов Python, вы можете прикреплять новые атрибуты к pandas.DataFrame
:
import pandas as pd
df = pd.DataFrame([])
df.instrument_name = 'Binky'
Обратите внимание, однако, что, хотя вы можете прикреплять атрибуты к DataFrame, операции, выполняемые в DataFrame (например, groupby
, pivot
, join
или loc
, чтобы назвать только несколько), могут возвращать новую DataFrame без прикрепленных метаданных. Pandas еще не имеет надежного метода распространения метаданных, прикрепленных к DataFrames.
Сохранение метаданных в файле возможно. Вы можете найти пример того, как хранить метаданные в файле HDF5 здесь.
Ответ 2
Просто наткнулся на эту проблему сам. Начиная с pandas 0.13, DataFrames имеют для них атрибут _metadata, который сохраняется через функции, возвращающие новые DataFrames. Также, кажется, выживает сериализация просто отлично (я только пробовал json, но я думаю, что hdf также покрыт).
Ответ 3
Не совсем. Хотя вы можете добавлять атрибуты, содержащие метаданные в класс DataFrame, как упоминания @unutbu, многие методы DataFrame возвращают новый DataFrame, поэтому ваши метаданные будут потеряны. Если вам нужно манипулировать вашим фреймворком данных, лучшим вариантом будет объединение ваших метаданных и DataFrame в другой класс. См. Обсуждение GitHub: https://github.com/pydata/pandas/issues/2485
В настоящее время существует открытый запрос на перенос, чтобы добавить объект MetaDataFrame, который лучше поддерживал бы метаданные.
Ответ 4
Придя к этому довольно поздно, я подумал, что это может быть полезно, если вам нужны метаданные для продолжения ввода-вывода. Там был относительно новый пакет под названием h5io, который я использовал для этого.
Он должен позволить вам быстро читать/писать из HDF5 для нескольких распространенных форматов, один из которых является фреймворком данных. Таким образом, вы можете, например, поместить в словарь словаря и включить метаданные в качестве полей в словаре. Например:.
save_dict = dict(data=my_df, name='chris', record_date='1/1/2016')
h5io.write_hdf5('path/to/file.hdf5', save_dict)
in_data = h5io.read_hdf5('path/to/file.hdf5')
df = in_data['data']
name = in_data['name']
etc...
Другим вариантом будет просмотр проекта, такого как xray, который в некоторых отношениях является более сложным, но я думаю, что это позволяет вам использовать метаданных и довольно легко конвертировать в DataFrame.
Ответ 5
Как упоминалось в других ответах и комментариях, _metadata
не является частью общедоступного API, поэтому определенно не рекомендуется использовать его в рабочей среде. Но вы все равно можете использовать его в прототипировании исследований и заменить его, если он перестанет работать. И сейчас он работает с groupby
/apply
, что полезно. Это пример (который я не мог найти в других ответах):
df = pd.DataFrame([1, 2, 2, 3, 3], columns=['val'])
df.my_attribute = "my_value"
df._metadata.append('my_attribute')
df.groupby('val').apply(lambda group: group.my_attribute)
Вывод:
val
1 my_value
2 my_value
3 my_value
dtype: object
Ответ 6
Как упоминалось в @choldgraf, я обнаружил, что xarray является отличным инструментом для привязки метаданных при сравнении данных и построении результатов между несколькими кадрами данных.
В моей работе мы часто сравниваем результаты нескольких версий прошивки и различных тестовых сценариев, добавляя эту информацию так же просто, как это:
df = pd.read_csv(meaningless_test)
metadata = {'fw': foo, 'test_name': bar, 'scenario': sc_01}
ds = xr.Dataset.from_dataframe(df)
ds.attrs = metadata
Ответ 7
Лучший ответ на присоединение произвольных атрибутов к объекту DataFrame - хороший, но если вы используете словарь, список или кортеж, он выдаст ошибку "Pandas не позволяет создавать столбцы с помощью нового имени атрибута". Следующее решение работает для хранения произвольных атрибутов.
from types import SimpleNamespace
df = pd.DataFrame()
df.meta = SimpleNamespace()
df.meta.foo = [1,2,3]
Ответ 8
У меня возникла та же проблема, и я использовал обходной путь создания нового меньшего DF из словаря с метаданными, которые я хотел сохранить и ориентировать по индексу:
meta = {"name": "Sample Dataframe", "Created": "19/07/2019"}
dfMeta = pd.DataFrame.from_dict(meta, orient='index')
Эта dfMeta может быть сохранена вместе с вашим оригинальным DF в маринаде и т.д.