Добавление мета-данных/метаданных для панды фрейма данных


можно ли добавить некоторую метаинформацию / метаданные в фрейм данных pandas?

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

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

6 56

6 ответов:

конечно, как и большинство объектов в Python, вы можете прикрепить новые атрибуты к pandas.DataFrame:

import pandas as pd
df = pd.DataFrame([])
df.instrument_name = 'Binky'

обратите внимание, однако, что, хотя вы можете прикрепить атрибуты к фрейму данных, операции, выполняемые с фреймом данных (например,groupby,pivot,join или loc чтобы назвать только несколько) может вернуть новый фрейм данных без метаданные, добавленные. Панды еще не имеют надежного метода распространяющейсяметаданные, добавленные в Фреймы данных.

сохранение метаданных в файле возможно. Вы можете найти пример того, как хранить метаданные в файле HDF5 здесь.

просто столкнулся с этой проблемой сам. Начиная с pandas 0.13, DataFrames имеют атрибут _metadata на них, который сохраняется через функции, возвращающие новые фреймы данных. Также кажется, что сериализация выживет просто отлично (я только пробовал json, но я думаю, что hdf также покрыт).

Не совсем так. Хотя вы можете добавить атрибуты, содержащие метаданные в класс DataFrame, как упоминает @unutbu, многие методы DataFrame возвращают новый фрейм данных, поэтому ваши метаданные будут потеряны. Если вам нужно манипулировать вашим фреймом данных, то лучшим вариантом будет обернуть ваши метаданные и фрейм данных в другой класс. См. это обсуждение на GitHub:https://github.com/pydata/pandas/issues/2485

в настоящее время открытый pull-запрос добавить объект MetaDataFrame, который лучше поддерживает метаданные.

приходя довольно поздно к этому, я подумал, что это может быть полезно, если вам нужны метаданные для сохранения над I / O. есть относительно новый пакет под названием 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, что в некотором смысле сложнее, но я думаю, что это позволяет использовать метаданные и довольно легко конвертировать в фрейм данных.

как уже упоминалось в других ответов и комментариев _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

Как упоминалось @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