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


90

Pandas DataFrame에 일부 메타 정보 / 메타 데이터를 추가 할 수 있습니까?

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

한 가지 해결 방법은 해당 정보로 열을 만드는 것이지만 모든 행에 단일 정보를 저장하는 것은 낭비 인 것 같습니다!


시작처럼 보이는 업데이트 된 실험 속성 'attrs'를 언급하는 @ryanjdillon 답변 (현재 하단 근처에 묻혀 있음)을 참고하십시오.
JohnE

답변:


85

물론 대부분의 Python 객체와 마찬가지로에 새 속성을 첨부 할 수 있습니다 pandas.DataFrame.

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

단, 당신이 DataFrame에 속성을 첨부 할 수있는 반면 것으로, 작업 (예 : 같은 DataFrame에서 수행 groupby, pivot, join또는 loc새로운 DataFrame을 반환 할 수 있습니다 몇 가지 이름을 위해) 없이 첨부 된 메타 데이터. Pandas에는 아직 DataFrames에 연결된 메타 데이터전파 하는 강력한 방법이 없습니다 .

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


5
+1 악기 이름 선택! 이러한 추가 속성을 HDFStore에 덤프하려는 경험이 있습니까?
Dan Allan 2013

4
@DanAllan :이면 store = pd.HDFStore(...)속성을 store.root._v_attrs.key = value.
unutbu

3
이것을 사용하는 다른 사람에게 : 문서는 이것에 대한 섹션을 추가했습니다. pandas.pydata.org/pandas-docs/dev/cookbook.html#hdfstore
Dan Allan


4
pandas 0.23.1에서 사전, 목록 또는 튜플을 할당하여 새 속성을 df = pd.DataFrame(); df.meta = {}생성 하면 경고가 발생합니다 (예 : 생성 UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access). (에서와 같이 속성이 이미 생성 된 경우 경고가 표시되지 않습니다 df = pd.DataFrame(); df.meta = ''; df.meta = {}.)
teichert

13

이 문제를 직접 만났습니다. Pandas 0.13부터 DataFrames에는 새 DataFrame을 반환하는 함수를 통해 지속되는 _metadata 속성이 있습니다. 또한 직렬화에서 잘 살아남는 것 같습니다 (json 만 시도했지만 hdf도 포함되어 있다고 생각합니다).


16
_metadata공개 API의 일부가 아니므로이 기능에 의존하지 않는 것이 좋습니다.
shoyer

@Stephan 당신은 그것에 대해 자세히 설명해 주시겠습니까? 퍼블릭 API의 일부가되는 것이 왜 중요한가요? 귀하의 진술은 버전 0.15에 대해서도 사실입니까?
TomCho 2015

1
@TomCho 네, 그 대답은 오늘날에도 여전히 사실입니다. 특히 다차원 데이터 가있는 경우 (xray API의 일부인 경우) 메타 데이터를 지원하는 레이블이 지정된 배열의 대체 예에 대해 xray ( github.com/xray/xray )를 살펴볼 수 있습니다..attrs
shoyer

17
_metadata실제로는 인스턴스 속성이 아니라 클래스 속성입니다. 따라서 DataFrame모듈이로드 된 상태로 유지되는 한 새 인스턴스는 이전 인스턴스에서 상속됩니다. _metadata아무것도 사용하지 마십시오 . 에 대한 +1 xarray!
j08lue

1
_metadata-내 하루를 구한 지원되지 않는 기능! 감사합니다.
joctee

12

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

현재 메타 데이터를 더 잘 지원하는 MetaDataFrame 객체를 추가하기 위한 공개 풀 요청 이 있습니다.


11

pandas 1.0, 아마도 이전 버전부터는 이제 Dataframe.attrs속성이 있습니다. 실험적이지만 향후에 원할 것입니다. 예를 들면 :

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

여기 문서에서 찾아보십시오 .

이 밖을 시도 to_parquet하고 from_parquet, 그것을 유지하지 않는 것, 그래서 당신이 사용 사례와 그 체크 아웃합니다.


이것은 흥미롭고 copy / loc / iloc에 대해서는 지속되지만 groupby에는 지속되지 않는 것 같습니다.
JohnE

제안 일 뿐이지 만 사용 방법의 예를 보여줄 수 있습니까? 문서는 기본적으로 아무것도 아니지만, 그냥 가지고 놀아 보면 빈 사전으로 초기화 된 것을 알 수 있으며, 물론 그 안에 목록을 중첩 할 수 있지만 사전이되도록 설정되어있는 것 같습니다. 예를 들면.
JohnE

1
필요한 경우 사용자 지정 메타 데이터를 쪽모이 세공 파일에 추가하는 방법을 보여주는 이 Stackoverflow 토론이 유용 할 수 있습니다.
rdmolony

1
@rdmolony 대단합니다. dataclass메타 데이터에를 사용하고 DataFrame공유 한 게시물에서와 같이로드 / 덤핑을 수행하는 메서드 를 하위 클래스 화 하는 것이 좋은 해결책이 될 수 있다고 생각합니다.
ryanjdillon

1
이거 좋은데. 받아 들여지는 답변과 달리 피클에서 저장하고로드 한 후 속성이 유지됩니다!
CGFoX

8

임의의 속성을 DataFrame 개체에 연결하는 가장 좋은 대답은 좋지만 사전, 목록 또는 튜플을 사용하는 경우 "Pandas에서는 새 속성 이름을 통해 열을 만들 수 없습니다"라는 오류가 발생합니다. 다음 솔루션은 임의의 속성을 저장하는 데 효과적입니다.

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

또한 이것이 데이터 프레임의 복사본에서 지속되도록하려면 pd.DataFrame._metadata += ["meta"]. 이 부분은 특정 데이터 프레임의 속성이 아니라 Pandas의 속성입니다
bscan

이 접근 방식은 df.metaPandas가 이러한 방식으로 새 열을 생성하는 것을 허용하지 않는다는 경고를 트리거하므로 더 이상 작동 하지 않습니다.
anishtain4

@ anishtain4, 방금 Pandas 25.1 (~ 2 주 전에 릴리스 됨)으로 테스트했으며이 코드는 여전히 저에게 효과적입니다. 이 경고는 df.metaSimpleNamespace 이므로 트리거되지 않습니다 . Pandas는 열을 만들려고하지 않습니다.
bscan

6

다른 답변과 의견에서 언급했듯이은 _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

4

꽤 늦게 와서 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 와 같은 프로젝트를 살펴 보는 것 입니다 .이 프로젝트 는 어떤면에서 더 복잡하지만 메타 데이터를 사용할 수 있고 DataFrame으로 변환하기가 매우 쉽습니다.


4

@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

2

나는 해결책을 찾고 있었고 pandas 프레임에 속성이 있음을 발견했습니다. attrs

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

이 속성은 통과 할 때마다 항상 프레임에 고정됩니다!


attrs는 실험적이며 경고없이 변경 될 수 있지만 이것은 매우 간단한 해결책입니다. 속성이 새 데이터 프레임으로 전송되는지 궁금합니다.
Liquidgenius

불행히도 속성은 새 데이터 프레임에 복사되지 않습니다. (
Adam

1

동일한 문제가 발생하여 메타 데이터가있는 사전에서 더 작은 새 DF를 만드는 해결 방법을 사용했습니다.

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

이 dfMeta는 피클 등의 원본 DF와 함께 저장할 수 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.