こんにちは、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]
}
この辞書は、従業員の情報(名前、年齢、部署、給与)を持つデータです。name、age、department、salaryがキーとなり、それぞれに対応するリストが値として格納されています。
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に変換した後、カラムの順番やデータ型を調整することも可能です。例えば、ageとsalaryのカラムを入れ替えたい場合や、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に変換し、分析や操作を行うことができます。
参考リンク
- Pandas公式ドキュメント – DataFrameの作成
DataFrameを作成するための公式ドキュメント。 - Pandas公式ドキュメント –
pd.DataFrame
DataFrameに関する詳細な説明。 - Python公式ドキュメント – 辞書型
Pythonの辞書型について学べる公式ドキュメント。
少しだけPRです。
Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。
最後まで読んでいただきありがとうございます。73


コメント