【Python】縦持ち・横持ちデータの作成をマスター!Pandasで効率的なデータ整形

はじめに

データ分析や機械学習のプロジェクトでは、データの整形が非常に重要です。特に、縦持ちデータ(縦型データ)と横持ちデータ(横型データ)の変換はよく行われる作業です。この記事では、PythonのライブラリであるPandasを使用して、縦持ちデータ横持ちデータの変換方法を詳しく解説します

縦持ちデータと横持ちデータの違い

縦持ちデータ(縦型データ)と横持ちデータ(横型データ)は、データの表現方法の違いを指します。縦持ちデータは、1つのデータが1行に対応し、複数のデータが列方向に並んでいます。一方、横持ちデータは、1つのデータが1列に対応し、複数のデータが行方向に並んでいます。

例えば、以下のような縦持ちデータがあったとします。

   日付    | 都道府県 | 人口
-----------|----------|------
2020/01/01 |   東京   | 1000
2020/01/01 |   大阪   | 800
2020/01/02 |   東京   | 1100
2020/01/02 |   大阪   | 820

このデータを横持ちデータに変換すると、以下のようになります。

   日付    | 東京 | 大阪
-----------|------|-----
2020/01/01 | 1000 | 800
2020/01/02 | 1100 | 820

縦持ちデータの方が個々の観測値が明確に区別され、行ごとにまとまっているため、データの解釈や処理がしやすくなります。一方、横持ちデータは、特定の属性に関する値が横方向に並んでいるため、属性ごとにまとめて比較や集計を行いやすくなります。

縦持ちデータを横持ちデータに変換する方法(ピボットテーブル)

Pandasでは、縦持ちデータを横持ちデータに変換するための便利なメソッドが用意されています。その中でも、特に有用なのが「ピボットテーブル」です。

以下の例を使って、ピボットテーブルを使った縦持ちデータから横持ちデータへの変換方法を見てみましょう。

import pandas as pd

# 縦持ちデータの作成
data = {'日付': ['2020/01/01', '2020/01/01', '2020/01/02', '2020/01/02'],
        '都道府県': ['東京', '大阪', '東京', '大阪'],
        '人口': [1000, 800, 1100, 820]}
df = pd.DataFrame(data)

# ピボットテーブルによる変換
pivot_df = df.pivot(index='日付', columns='都道府県', values='人口')
print(pivot_df)

上記のコードを実行すると、以下のような横持ちデータが得られます。

都道府県    |  東京 | 大阪
------------|------|-----
 日付       |      |
2020/01/01  | 1000 | 800
2020/01/02  | 1100 | 820

ピボットテーブルでは、`pivot()`メソッドを使用し、`index`引数には行に配置する列を指定し、`columns`引数には列に配置する列を指定します。そして、`values`引数には値として使用する列を指定します。

横持ちデータを縦持ちデータに変換する方法(メルト関数)

import pandas as pd

# 横持ちデータの作成
data = {'日付': ['2020/01/01', '2020/01/02'],
        '東京': [1000, 1100],
        '大阪': [800, 820]}
df = pd.DataFrame(data)

# メルト関数による変換
melted_df = pd.melt(df, id_vars='日付', var_name='都道府県', value_name='人口')
print(melted_df)

上記のコードを実行すると、以下のような縦持ちデータが得られます。

   日付    | 都道府県 | 人口
-----------|----------|------
2020/01/01 |   東京   | 1000
2020/01/02 |   東京   | 1100
2020/01/01 |   大阪   | 800
2020/01/02 |   大阪   | 820

melt()関数では、id_vars引数には縦持ちデータで共通の識別子となる列(この場合は「日付」)を指定し、var_name引数には変換後の縦持ちデータの列名となる列(この場合は「都道府県」)を指定します。そして、value_name引数には値として変換される列名(この場合は「人口」)を指定します。

逆に、横持ちデータを縦持ちデータに変換する方法も重要です。Pandasでは、「メルト(melt)」という関数を使って簡単に横持ちデータを縦持ちデータに変換することができます。以下の例を使って、メルト関数を使った横持ちデータから縦持ちデータへの変換方法を見てみましょう。

データ変換時の注意点と応用例

データの縦持ち・横持ち変換にはいくつかの注意点があります。以下にその一部を紹介します。データの一意性: 変換後のデータに重複がないように注意しましょう。ピボットテーブルを使用する場合は、indexやcolumnsの組み合わせが一意の値を生成することを確認しましょう。欠損値の処理: 変換時に欠損値が発生した場合、適切に処理する必要があります。Pandasでは、dropna()やfillna()などのメソッドを使用して欠損値を処理することができます。応用例: 縦持ちデータと横持ちデータの変換は、データ分析や可視化、集計などさまざまな場面で活用されます。

例えば、複数のセンサーから得られた時系列データを縦持ちから横持ちに変換することで、異なるセンサーのデータを比較しやすくなったり、特定の期間のデータをまとめて集計することができます。また、逆に横持ちデータから縦持ちデータへの変換も応用的な活用ができます。例えば、複数の変数に対する観測値が横持ちで表現されている場合、メルト関数を使用して縦持ちデータに変換することで、データの結合や解析がしやすくなります。

まとめ

この記事では、PythonのPandasライブラリを使用して縦持ちデータと横持ちデータの変換方法について解説しました。縦持ちデータを横持ちデータに変換するためにはピボットテーブルを使用し、横持ちデータを縦持ちデータに変換するためにはメルト関数を使用します。データ変換の際には一意性や欠損値の処理に注意し、データの解析や可視化に応用することができます。データ整形はデータ分析の基礎となる重要なステップであり、Pandasの豊富な機能を駆使して効率的に行えることは非常に便利です。是非、この記事を参考にしてPandasを活用してデータ整形のスキルを向上させてください。