スキルUP!データ分析実践

Pandasで学ぶデータ結合:MergeとConcatを使いこなす入門

Tags: Pandas, データ結合, データ連結, データ前処理, Python, 初心者

データ分析におけるデータ結合の重要性

データ分析を進める上で、扱うデータは単一のファイルやテーブルから得られるとは限りません。多くの場合、異なるソースから収集された複数のデータを組み合わせる必要があります。例えば、顧客リストと購買履歴、製品情報と販売データなど、別々の場所に保管されている情報を関連付けて分析することで、より深い洞察を得ることが可能になります。

このような複数のデータを一つにまとめる作業を「データ結合」または「データ連結」と呼びます。これはデータ分析の最初のステップである「データ前処理」において非常に重要なプロセスです。適切にデータを結合・連結することで、分析の準備が整い、次のステップへとスムーズに進むことができます。

この記事では、Pythonの強力なデータ分析ライブラリであるPandasを使用して、複数のデータを結合・連結する基本的な方法を解説します。特に、実務で頻繁に利用されるmerge関数とconcat関数に焦点を当て、それぞれの使い方と使い分けについて、具体的なコード例を交えながら説明します。

Pandasにおけるデータ結合・連結の主要関数

Pandasには、データを結合・連結するためのいくつかの関数が用意されていますが、主に使われるのは以下の二つです。

これらの関数を理解し使い分けることが、効率的なデータ前処理を行うための鍵となります。

キーに基づくデータ結合:pd.merge()

pd.merge()関数は、二つのデータフレームに共通するキー列を指定してデータを結合するために使用されます。SQLのJOIN操作をご存知であれば、その概念とよく似ています。

mergeの基本的な使い方

最も基本的な使い方は、結合する二つのデータフレームと、結合のキーとなる列を指定することです。

import pandas as pd

# サンプルデータフレームの作成
df1 = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'name': ['Alice', 'Bob', 'Charlie', 'David']
})

df2 = pd.DataFrame({
    'id': [1, 3, 5, 6],
    'city': ['Tokyo', 'Osaka', 'Nagoya', 'Fukuoka']
})

print("df1:")
print(df1)
print("\ndf2:")
print(df2)

# 'id'列をキーとして結合(デフォルトはinner結合)
merged_df = pd.merge(df1, df2, on='id')

print("\nMerged DataFrame (inner join on 'id'):")
print(merged_df)

上記の例では、df1df2を、共通する列である'id'をキーとして結合しています。デフォルトではhow='inner'となり、両方のデータフレームに存在するidのみが結果に含まれます。

結合の種類(how引数)

pd.merge()how引数を使うことで、SQLのJOINと同様に様々な種類の結合を指定できます。

# 'id'列をキーとして左結合
left_merged_df = pd.merge(df1, df2, on='id', how='left')
print("\nLeft Merged DataFrame:")
print(left_merged_df)

# 'id'列をキーとして右結合
right_merged_df = pd.merge(df1, df2, on='id', how='right')
print("\nRight Merged DataFrame:")
print(right_merged_df)

# 'id'列をキーとして外部結合
outer_merged_df = pd.merge(df1, df2, on='id', how='outer')
print("\nOuter Merged DataFrame:")
print(outer_merged_df)

異なるキー列名での結合

結合キーとなる列名が二つのデータフレームで異なる場合もあります。その際は、left_onright_on引数を使用してそれぞれのデータフレームのキー列を指定します。

df3 = pd.DataFrame({
    'user_id': [1, 3, 5, 6],
    'purchase_amount': [1000, 5000, 3000, 2000]
})

print("\ndf3:")
print(df3)

# df1の'id'列とdf3の'user_id'列をキーとして結合
merged_df_diff_key = pd.merge(df1, df3, left_on='id', right_on='user_id', how='inner')

print("\nMerged DataFrame (different key names):")
print(merged_df_diff_key)

単純なデータ連結:pd.concat()

pd.concat()関数は、複数のデータフレームを単純に縦方向(行を追加)または横方向(列を追加)に連結するために使用されます。これは、同じ構造を持つデータを結合する場合や、新しい列を追加する場合などに役立ちます。

concatの基本的な使い方

連結したいデータフレームのリストを第一引数に渡し、連結方向をaxis引数で指定します(0が行方向、1が列方向)。デフォルトはaxis=0(行方向)です。

# サンプルデータフレームの作成
df_a = pd.DataFrame({
    'col1': ['A0', 'A1'],
    'col2': ['A2', 'A3']
})

df_b = pd.DataFrame({
    'col1': ['B0', 'B1'],
    'col2': ['B2', 'B3']
})

print("df_a:")
print(df_a)
print("\ndf_b:")
print(df_b)

# 行方向への連結
concatenated_rows = pd.concat([df_a, df_b], axis=0)

print("\nConcatenated DataFrame (axis=0, rows):")
print(concatenated_rows)

# 列方向への連結
concatenated_cols = pd.concat([df_a, df_b], axis=1)

print("\nConcatenated DataFrame (axis=1, columns):")
print(concatenated_cols)

行方向に連結する場合、元のデータフレームのインデックスがそのまま引き継がれることに注意してください。必要に応じて、ignore_index=Trueを引数に加えることで、新しい連番のインデックスを振り直すことができます。

# 行方向への連結(インデックスを振り直し)
concatenated_rows_reset_index = pd.concat([df_a, df_b], axis=0, ignore_index=True)

print("\nConcatenated DataFrame (axis=0, ignore_index=True):")
print(concatenated_rows_reset_index)

mergeconcatの使い分け

mergeconcatはどちらもデータを結合する機能を持っていますが、その目的と使い方が異なります。

どちらを使うべきかは、結合したいデータの構造と、どのように組み合わせたいかによって判断します。

まとめと次のステップ

この記事では、データ分析の実践において不可欠なスキルであるデータ結合・連結について、Pandasのmerge関数とconcat関数を中心に解説しました。

これらの関数を使いこなせるようになれば、様々な形式で提供される実世界のデータを効率的に前処理し、分析可能な形に整えることができるようになります。

まずは、ご自身の身近にある、複数のファイルに分かれているデータを集めて、今回学んだmergeconcatを試してみてください。例えば、CSVファイルとして保存された顧客リストと購入履歴、異なる期間の売上データなどを組み合わせてみるのも良いでしょう。

データ結合・連結はデータ前処理の重要な一歩です。このスキルを習得し、次の分析ステップへ進む準備を整えましょう。