programing

Panda DataFrame에 메타 정보/메타데이터 추가

skycolor 2023. 7. 21. 21:29
반응형

Panda DataFrame에 메타 정보/메타데이터 추가

판다 데이터 프레임에 메타 정보/메타데이터를 추가할 수 있습니까?

예를 들어, 데이터를 측정하는 데 사용되는 계측기 이름, 담당 계측기 등입니다.

한 가지 해결 방법은 해당 정보로 열을 만드는 것이지만, 모든 행에 하나의 정보를 저장하는 것은 낭비입니다!

객체와 로 새로운 , 대의 Python 객로속에 할 수 .pandas.DataFrame:

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

DataFrame에할 수 예: " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 을 사용합니다.groupby,pivot,join,assign또는loc 예를 들어) 메타데이터가 첨부되지 않은 상태에서 새 데이터 프레임을 반환할 수 있습니다.Panda는 아직 데이터 프레임에 연결메타데이터전파하는 강력한 방법을 가지고 있지 않습니다.

파일의 메타데이터를 보존할 수 있습니다.여기에서 HDF5 파일에 메타데이터를 저장하는 방법의 예를 찾을 수 있습니다.

판다 1.0, 아마도 더 이전에, 지금은Dataframe.attrs이긴 하지만 일 것입니다.그것은 실험적이지만, 이것은 아마도 미래에 여러분이 원하는 것일 것입니다.예:

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

여기 서류에서 찾아보세요.

이것을 사용해 보는 것.to_parquet그리고 나서.from_parquet지속되지 않는 것 같으니, 사용 사례와 함께 확인하십시오.

방금 이 문제에 직접 부딪혔습니다.판다 0.13 기준으로 데이터 프레임에는 새로운 데이터 프레임을 반환하는 함수를 통해 유지되는 _metadata 속성이 있습니다.또한 직렬화에서도 잘 살아남는 것 같습니다(json만 시도해봤지만, hdf도 커버된 것 같습니다).

사실 그렇지 않아요.@unutbu가 언급하는 대로 메타데이터를 포함하는 특성을 DataFrame 클래스에 추가할 수 있지만, 많은 DataFrame 메서드가 새 DataFrame을 반환하므로 메타데이터가 손실됩니다.데이터 프레임을 조작해야 하는 경우 메타데이터와 데이터 프레임을 다른 클래스로 래핑하는 것이 가장 좋습니다.GitHub에서 이 토론을 참조하십시오. https://github.com/pydata/pandas/issues/2485

현재 메타데이터를 더 잘 지원할 수 있는 MetaDataFrame 개체를 추가하기 위한 열린 끌어오기 요청이 있습니다.

DataFrame 개체에 임의 속성을 첨부하는 상위 답변은 좋지만 사전, 목록 또는 튜플을 사용하는 경우 "Pandas는 새 속성 이름을 통해 열을 생성할 수 없습니다."라는 오류를 표시합니다.다음 솔루션은 임의 속성을 저장하는 데 사용됩니다.

from types import SimpleNamespace
df = pd.DataFrame()
df.meta = SimpleNamespace()
df.meta.foo = [1,2,3]

댓글에서도 했듯이, 다른답변댓언도이듯급했서글에과,이,_metadata퍼블릭 API의 일부가 아니므로 프로덕션 환경에서 사용하는 것은 절대 좋은 생각이 아닙니다.하지만 여전히 연구 프로토타이핑에 사용하고 작동이 중단되면 교체해야 할 수도 있습니다.은 그고지금그작다니동합것이리은▁with▁works다▁and니동작합▁it▁now.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

이 문제에 대해 상당히 늦은 감이 있지만, 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와 같은 프로젝트를 조사하는 것입니다. xray는 어떤 면에서는 더 복잡하지만 메타데이터를 사용할 수 있고 DataFrame으로 변환하기가 매우 쉽다고 생각합니다.

저는 해결책을 찾고 있었고 판다 프레임이 그 특성을 가지고 있다는 것을 발견했습니다.attrs

pd.DataFrame().attrs.update({'your_attribute' : 'value'})
frame.attrs['your_attribute']

이 속성은 프레임을 통과할 때마다 항상 프레임에 부착됩니다!

원본 속성(of the official Pandas documentation) 정의 섹션을 참조하여 하위 분류가 옵션인 경우 다음 사항에 유의하십시오.

원래 데이터 구조에 추가 속성이 있도록 하려면 다음과 같이 해야 합니다.pandas추가된 속성을 확인합니다.

따라서, 당신이 할 수 있는 은 - 이름이 임의로 선택되는 곳 - 입니다.

class MetaedDataFrame(pd.DataFrame):
    """s/e."""
    _metadata = ['instrument_name']

    @property
    def _constructor(self):
        return self.__class__

    # Define the following if providing attribute(s) at instantiation
    # is a requirement, otherwise, if YAGNI, don't.
    def __init__(
        self, *args, instrument_name: str = None, **kwargs
    ):
        super().__init__(*args, **kwargs)
        self.instrument_name = instrument_name

다음 으)로합니다._metadata-prespecified) 특

>>> mdf = MetaedDataFrame(instrument_name='Binky')
>>> mdf.instrument_name
'Binky'

또는 인스턴스화 후에도

>>> mdf = MetaedDataFrame()
>>> mdf.instrument_name = 'Binky'
'Binky'

아무런 경고도 없이 (2021/06/15 기준) : 연재와 작업이 매력적입니다.또한, 이러한 접근 방식은 예를 들어 몇 가지를 추가함으로써 당신의 API를 풍부하게 할 수 있습니다.instrument_name에 기반을 둔 구성원.MetaedDataFrame속성(또는 메서드):

    [...]
    
    @property
    def lower_instrument_name(self) -> str:
        if self.instrument_name is not None:
            return self.instrument_name.lower()

    [...]
>>> mdf.lower_instrument_name
'binky'

하지만 이것은 이 질문의 범위 밖에 있습니다...

저는 동일한 문제를 겪고 있었고 메타데이터가 있는 사전에서 더 작은 새 DF를 만드는 방법을 사용했습니다.

    meta = {"name": "Sample Dataframe", "Created": "19/07/2019"}
    dfMeta = pd.DataFrame.from_dict(meta, orient='index')

그러면 이 dfMeta는 피클 등에서 원래 DF와 함께 저장될 수 있습니다.

피클을 사용하여 여러 데이터 프레임을 저장하고 검색하는 방법에 대한 자세한 내용은 피클 파일에 여러 개체 저장 및 로드를 참조하십시오. (Lutz의 답변)

판다와 함께 원시 속성 추가(예:df.my_metadata = "source.csv")은 좋은 생각이 아닙니다.

최신 버전(파이썬 3.8의 1.2.4)에서도 이 작업을 수행하면 다음과 같은 매우 간단한 작업을 수행할 때 무작위로 세그먼트 결함이 발생합니다.read_csv디버깅하기가 어려울 것입니다. 왜냐하면read_csv잘 작동하지만 나중에 (임의로 실행) 데이터 프레임이 메모리에서 해방되었음을 알게 될 것입니다.

판다와 관련된 사이프톤 확장은 데이터 프레임의 데이터 레이아웃에 대해 매우 명시적인 가정을 하는 것처럼 보입니다.

attrs현재 메타데이터 속성을 안전하게 사용할 수 있는 유일한 방법: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.attrs.html

예.

df.attrs.update({'my_metadata' : "source.csv"})

모든 시나리오에서 속성이 어떻게 행동해야 하는지는 완전히 구체화되지 않았습니다.의 예상 행동에 대한 피드백을 제공할 수 있습니다.attrs이번 호: https://github.com/pandas-dev/pandas/issues/28283

판다에 따르면 HDF 스토어에 데이터 프레임을 저장하려는 사람들을 위한 것입니다.pydata.org 에서 권장되는 접근 방식은 다음과 같습니다.

import pandas as pd

df = pd.DataFrame(dict(keys=['a', 'b', 'c'], values=['1', '2', '3']))
df.to_hdf('/tmp/temp_df.h5', key='temp_df')
store = pd.HDFStore('/tmp/temp_df.h5') 
store.get_storer('temp_df').attrs.attr_key = 'attr_value'
store.close()

언급URL : https://stackoverflow.com/questions/14688306/adding-meta-information-metadata-to-pandas-dataframe

반응형