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