Подтвердить что ты не робот

Добавление метаинформации/метаданных в pandas DataFrame

Можно ли добавить мета-информацию/метаданные в pandas DataFrame?

Например, имя инструмента, используемое для измерения данных, ответственного за инструмент и т.д.

Одним из способов было бы создать столбец с этой информацией, но кажется бесполезным хранить единый фрагмент информации в каждой строке!

4b9b3361

Ответ 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 в маринаде и т.д.