Прикрепить информацию об источнике данных к серии панд - PullRequest
0 голосов
/ 08 октября 2018

Есть ли способ прикрепить информацию об источнике данных к серии панд?На данный момент я просто добавляю столбцы данных в фрейм данных, которые указывают источник для каждой переменной ...

Большое спасибо за идеи и предложения!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Из официальной документации pandas :

Чтобы исходные структуры данных имели дополнительные свойства, вы должны сообщить pandas, какие свойства добавлены.pandas отображает неизвестные свойства на имена данных, переопределяющие __getattribute__.Определение исходных свойств может быть выполнено одним из двух способов:

  1. Определите _internal_names и _internal_names_set для временных свойств, которые НЕ будут переданы в результаты манипуляции.

  2. Определите _metadata для нормальных свойств, которые будут переданы в результаты манипуляции.

Ниже приведен пример определения двух исходных свойств, «internal_cache» как временного свойстваи «Added_property» как обычное свойство

class SubclassedDataFrame2(DataFrame):

    # temporary properties
    _internal_names = pd.DataFrame._internal_names + ['internal_cache']
    _internal_names_set = set(_internal_names)

    # normal properties
    _metadata = ['added_property']

@property
def _constructor(self):
    return SubclassedDataFrame2

_

>>> df = SubclassedDataFrame2({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
>>> df
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

>>> df.internal_cache = 'cached'
>>> df.added_property = 'property'

>>> df.internal_cache
cached
>>> df.added_property
property

# properties defined in _internal_names is reset after manipulation
>>> df[['A', 'B']].internal_cache
AttributeError: 'SubclassedDataFrame2' object has no attribute 'internal_cache'

# properties defined in _metadata are retained
>>> df[['A', 'B']].added_property
property

Как вы можете увидеть преимущество определения пользовательских свойств с помощью _metadata в том, что свойства будутраспространяется автоматически во время (большинства) операций «один-к-одному» с фреймом данных.Имейте в виду, что во время операций с несколькими кадрами (например, merge() или concat()) ваши пользовательские свойства все равно будут потеряны.

0 голосов
/ 08 октября 2018

Как и большинство объектов Python, вы можете добавить атрибут, используя синтаксис точки (.).Однако вы должны быть осторожны, чтобы имена ваших атрибутов не конфликтовали с метками.Вот демонстрация:

import pandas as pd

s = pd.Series(list(range(3)), index=list('abc'))
s.a = 10
s.d = 20

print(s.a, s.d)

10 20

print(s)

a    10
b     1
c     2

Как и выше, вы можете невольно перезаписать значение метки, когда на самом деле вы хотите добавить атрибут a.Один из способов решить эту проблему, как описано здесь , - выполнить простую проверку:

if 'a' not in s:
    s.a = 100
else:
    print('Attempt to overwrite label when setting attribute aborted!')
    # or raise a custom error

Обратите внимание, что операции с кадром данных, такие как GroupBy, pivot и т. Д., как описано здесь , может возвращать копии данных с удаленными атрибутами.

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

...