【Pandas】辞書からDataFrameを作る

Pandas
この記事は約11分で読めます。

こんにちは、JS2IIUです。

Pandasでは、辞書型(dict)のデータを簡単にDataFrameに変換できます。辞書型データは、キーと値のペアで構成されており、キーがカラム名、値がカラムに対応するデータになります。この記事では、辞書型データを使ってDataFrameを作成する方法を、具体的なサンプルコードとともにわかりやすく説明します。

1. 辞書型データの形式

辞書型データは、キーとその対応する値をペアとして持っています。PandasのDataFrameに変換する場合、辞書の各キーはDataFrameのカラム名に、値はそのカラムに対応するデータ列として扱われます。

例えば、次のような辞書型データを考えてみましょう。

サンプル辞書データ:

data = {
    'name': ['John', 'Alice', 'Bob'],
    'age': [28, 32, 24],
    'department': ['HR', 'Finance', 'Engineering'],
    'salary': [50000, 60000, 55000]
}

この辞書は、従業員の情報(名前、年齢、部署、給与)を持つデータです。nameagedepartmentsalaryがキーとなり、それぞれに対応するリストが値として格納されています。

2. 辞書からDataFrameを作成する

Pandasでは、pd.DataFrame()を使って辞書からDataFrameを作成できます。辞書のキーがDataFrameのカラム名になり、対応する値がそのカラムのデータとなります。

サンプルコード:

import pandas as pd

# 辞書データ
data = {
    'name': ['John', 'Alice', 'Bob'],
    'age': [28, 32, 24],
    'department': ['HR', 'Finance', 'Engineering'],
    'salary': [50000, 60000, 55000]
}

# 辞書からDataFrameを作成
df = pd.DataFrame(data)

# DataFrameの表示
print(df)

出力例:

    name  age   department  salary
0   John   28           HR   50000
1  Alice   32      Finance   60000
2    Bob   24  Engineering   55000

このコードでは、辞書型データdataをPandasのpd.DataFrame()に渡し、簡単にDataFrameに変換しています。

3. DataFrameのカスタマイズ

辞書のデータをDataFrameに変換した後、カラムの順番やデータ型を調整することも可能です。例えば、agesalaryのカラムを入れ替えたい場合や、ageを整数型ではなく浮動小数点型にしたい場合などです。

カラムの順番を変更する:

# カラムの順番を変更
df = df[['name', 'salary', 'age', 'department']]

print(df)

出力例:

    name  salary  age   department
0   John   50000   28           HR
1  Alice   60000   32      Finance
2    Bob   55000   24  Engineering

カラムのデータ型を変更する:

# ageカラムを浮動小数点型に変更
df['age'] = df['age'].astype(float)

print(df)

出力例:

    name  age   department  salary
0   John  28.0           HR   50000
1  Alice  32.0      Finance   60000
2    Bob  24.0  Engineering   55000

このように、作成したDataFrameのカラムの順番やデータ型を簡単に変更することができます。

4. 辞書のリストを使った場合

辞書の中にリストを持つ形のデータを扱う場合もあります。たとえば、従業員が複数の部署を担当している場合のデータなどです。Pandasはこのようなデータも対応しています。

サンプル辞書データ(リスト):

data = {
    'name': ['John', 'Alice', 'Bob'],
    'age': [28, 32, 24],
    'departments': [['HR', 'IT'], ['Finance'], ['Engineering', 'Marketing']],
    'salary': [50000, 60000, 55000]
}

この場合、departmentsカラムにリストが入っているため、DataFrameの各行にリストがそのまま格納されます。

サンプルコード(リストを含む辞書から):

# 辞書データ(リストを含む)
data = {
    'name': ['John', 'Alice', 'Bob'],
    'age': [28, 32, 24],
    'departments': [['HR', 'IT'], ['Finance'], ['Engineering', 'Marketing']],
    'salary': [50000, 60000, 55000]
}

# 辞書からDataFrameを作成
df = pd.DataFrame(data)

# DataFrameの表示
print(df)

出力例:

    name  age          departments  salary
0   John   28             [HR, IT]   50000
1  Alice   32             [Finance]   60000
2    Bob   24  [Engineering, Marketing]   55000

このように、辞書内のリストもそのままDataFrameに格納されます。リストをフラット化したい場合は、apply()json_normalize()を使う方法もあります。

リストのフラット化についての補足

フラット化とは、入れ子構造のリストや複数の要素が入ったリストを「平坦化」し、一つの層に並べる処理です。例えば、従業員が複数の部署に所属している場合、その情報がリストとして格納されていることがあります。このままだとデータが入れ子構造のままで扱いにくいため、リストをフラット化して使いやすい形にすることが必要です。

フラット化が必要な例

次のような辞書データを考えます。

data = {
    'name': ['John', 'Alice', 'Bob'],
    'age': [28, 32, 24],
    'departments': [['HR', 'IT'], ['Finance'], ['Engineering', 'Marketing']],
    'salary': [50000, 60000, 55000]
}

departmentsカラムには複数の部署がリストとして格納されています。このデータをフラット化して、各従業員とその所属する各部署が1行ずつのデータとして表現されるようにしてみましょう。

フラット化の方法1: explode()を使う

Pandasのexplode()メソッドを使うと、リストを各要素ごとに行に展開してくれます。

import pandas as pd

# 辞書データ
data = {
    'name': ['John', 'Alice', 'Bob'],
    'age': [28, 32, 24],
    'departments': [['HR', 'IT'], ['Finance'], ['Engineering', 'Marketing']],
    'salary': [50000, 60000, 55000]
}

# DataFrame作成
df = pd.DataFrame(data)

# departmentsカラムをフラット化
df = df.explode('departments').reset_index(drop=True)
print(df)

出力例:

    name  age departments  salary
0   John   28         HR   50000
1   John   28         IT   50000
2  Alice   32    Finance   60000
3    Bob   24 Engineering  55000
4    Bob   24  Marketing   55000

explode()により、departmentsカラムのリストがそれぞれ独立した行に展開されました。これにより、従業員と部署の対応が1行ごとに明確になり、データの操作がしやすくなります。

フラット化の方法2: json_normalize()を使う

もし辞書の中にさらにネストされた辞書やリストがある場合、json_normalize()を使って複雑なデータ構造もフラット化できます。

以下のようなデータを考えます:

data = [
    {'name': 'John', 'age': 28, 'details': {'departments': ['HR', 'IT'], 'salary': 50000}},
    {'name': 'Alice', 'age': 32, 'details': {'departments': ['Finance'], 'salary': 60000}},
    {'name': 'Bob', 'age': 24, 'details': {'departments': ['Engineering', 'Marketing'], 'salary': 55000}}
]

このデータのdepartmentsを展開し、詳細情報を取り出すには次のようにします:

# JSONデータを正規化してDataFrame作成
df = pd.json_normalize(data, 'details.departments', ['name', 'age', ['details', 'salary']], record_prefix='department_')
print(df)

出力例:

  department_name  name  age  details_salary
0              HR  John   28           50000
1              IT  John   28           50000
2         Finance Alice   32           60000
3     Engineering   Bob   24           55000
4       Marketing   Bob   24           55000

このように、json_normalize()を使えば複雑な辞書型データもフラット化でき、ネストされたデータを扱いやすい形に変換できます。

まとめ

explode()json_normalize()を使うと、リストやネストされたデータをフラット化でき、Pandasでのデータ分析が容易になります。データの構造に応じて使い分けると良いでしょう。

5. まとめ

Pandasでは、辞書型データを簡単にDataFrameに変換できます。辞書の各キーはDataFrameのカラム名に対応し、各値はそのカラムのデータとなります。また、データ型やカラムの順番を変更したり、リストを含む辞書からもDataFrameを作成したりすることが可能です。

この方法を使うことで、辞書形式で持っているデータを効率的にPandasのDataFrameに変換し、分析や操作を行うことができます。

参考リンク

少しだけPRです。

Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。

最後まで読んでいただきありがとうございます。73

コメント

タイトルとURLをコピーしました