DataFrameにメタデータを加える【Python】

pandasのDataFrameはテーブル形式のデータベースですが、そのデータベース自体に付帯する情報(メタデータ)を付け加えたくなる場合があります。例えばそのデータの作成者や作成日時、測定条件などのようなものはデータベースの中に入れる訳にはいきませんが、データベースの欄外のどこかに保存しておきたい情報になります。pandasのDataFrameにはそのような情報も格納するための属性が用意されているので、ここではその使い方を見ていきましょう。

開発環境

  • pandas 1.2.1
  • Python 3.7.9

サンプルデータ

サンプルデータとして以下のデータを用います。

以下のようにURLを指定して、DataFrameとして取得できます。

df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')

メタデータとは?

メタデータ(メタ情報)とは「データについてのデータ」という意味で、そのデータベースについての付帯的な情報を表すものです。例えば先ほどのサンプルデータは名前と職業が載っていますが、いったいどういう人たちの名簿なのでしょうか?また、いつ更新されたものなのでしょうか?このようにデータ本体(=田中一郎、佐藤花子、… etc.)がどのようなデータなのかを説明する情報がメタデータになります。

データ本体とメタデータを一緒に保存する仕組みがあれば、バラバラにならなくていいですよね?よく用いられるメタデータの保存方法としてはファイル名をメタデータにしてしまう方法だと思います。ファイル名でそのデータの中身を表すようにしたことは皆さん経験あるのではないでしょうか?それは普遍的でよい方法に間違いないのですが、メタデータに複数の情報を入れるような場合はやはり扱いにくくなってしまいます。例えば何かの測定結果を表すDataFrameで、その測定日・測定者・測定装置名・測定条件などのすべての情報をメタデータとして入れるような場合は、メタデータのための何か専用の仕組みが欲しいですよね?

そこでpandasのDataFrameではメタデータを保存するための属性としてattrs属性が用意されています。それではこのattrs属性の使い方について見ていきましょう。

注意
pandas.DataFrameにおけるattrs属性はpandas 1.0.0から実験的な機能として実装されているものです。予告なく機能が変更されたりする場合もありますのでご注意ください。

DataFrameにメタデータを埋め込む

DataFrameのattrs属性は辞書形式でメタデータを格納します。

ここでは例として先ほどのサンプルデータのメタデータ(付帯情報)として次のような情報を格納しましょう。

  • データセット名(name):顧客リスト(client_list)
  • 最終更新日(last_update):[今日の日付]
  • 極秘(secret):True

上記の情報を格納する辞書を作成してそれをattrs属性に代入するだけで、DataFrameにメタデータを埋め込むことができます。

import pandas as pd
import datetime

df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
df.attrs = {'name':'client_list', 'last_update':datetime.date.today(), 'secret':True}
print(df.attrs)
{'name': 'client_list', 'last_update': datetime.date(2021, 9, 10), 'secret': True}

メタデータを埋め込んだDataFrameを保存してみる

DataFrameに埋め込んだメタデータは.pickleで保存しても保持されます。

import pandas as pd
import datetime

df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
df.attrs = {'name':'client_list', 'last_update':datetime.date.today(), 'secret':True}

df.to_pickle('df.pickle')
df2 = pd.read_pickle('df.pickle')
print(df.attrs)
{'name': 'client_list', 'last_update': datetime.date(2021, 9, 10), 'secret': True}

ただし、DataFrameの標準保存形式である.pickle以外では保持されませんので注意してください。

メタデータを埋め込んだDataFrameから新たなDataFrameを作成する

また、メタデータを埋め込んだDataFrameから、queryメソッドを用いてデータを抽出して作成した新たなDataFrameにもメタデータはそのまま引き継がれます。

import pandas as pd
import datetime

df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
df.attrs = {'name':'client_list', 'last_update':datetime.date.today(), 'secret':True}

df_new = df.query('年齢 > 40')
print(df_new.attrs)
{'name': 'client_list', 'last_update': datetime.date(2021, 9, 10), 'secret': True}

なお、queryメソッドについては以下の記事をご覧ください。

DataFrameのメタデータを読み込む

attrs属性に格納したメタデータは辞書形式のデータなので、そのキーを指定することで個々のメタデータを読み込むことができます。

それでは先ほどのメタデータから、データセット名、最終更新日、極秘情報か否かを読み込んでみましょう。

import pandas as pd
import datetime

df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
df.attrs = {'name':'client_list', 'last_update':datetime.date.today(), 'secret':True}

print(df.attrs['name'])
print(df.attrs['last_update'].isoformat())
print(df.attrs['secret'])
client_list
2021-09-10
True

関連記事・スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)