📘

【Pandas】Excelでは面倒なデータ結合を簡単に実現する方法📊

2025/01/01に公開

はじめに

「複数のExcelシートのデータを一つにまとめるのが大変...」
「VLOOKUPやPowerQueryは使いこなせないけど、なんとかデータを連結したい...」
「シートが増えるたびに手作業でコピペするのがつらい...」

こんな経験はありませんか?
私は、Excelで別々のシートにあるデータを一つの表にまとめようとして、いつも苦労していました。

そんな悩みを解決するのが、今回ご紹介する「pandas」というPythonのライブラリです。
pandasは、Excelのような表データを扱うためのツールで、特に複数の表をつなぎ合わせる作業が得意です。

pandasの表結合は何がすごいの?

pandasには、表をつなぎ合わせるための2つの便利な機能があります。

  1. merge(マージ): 共通の項目(例:商品名や社員番号など)をもとに、2つの表を横につなぎ合わせる機能。
  2. concat(コンキャット): 2つ以上の表を単純に縦や横に連結する機能。

具体的な例を見てみましょう。
以下のような2つの表があるとします。

売上データ

注文ID 商品名 個数 売上日
1 りんご 5 2024-03-01
2 みかん 3 2024-03-01
3 バナナ 2 2024-03-02

在庫データ

商品名 単価 在庫数
りんご 100 50
みかん 80 30
バナナ 120 20

これらの表を「商品名」をもとに結合すると、以下のような1つの表が作れます。

注文ID 商品名 個数 売上日 単価 在庫数 売上金額
1 りんご 5 2024-03-01 100 50 500
2 みかん 3 2024-03-01 80 30 240
3 バナナ 2 2024-03-02 120 20 240

Excelでこれを実現しようとすると、VLOOKUPを使ったり、手作業でコピペしたりと大変ですよね。でも、pandasを使えば、たった数行のコードで実現できるんです!

基本的な使い方

それでは、実際のコードを見ていきましょう。一つ一つ丁寧に解説します。

# まずはpandasをインポートします
# pdという短い名前を付けるのが一般的です
import pandas as pd

# CSVファイルを読み込みます
# read_csvは「CSVファイルを表(DataFrame)として読み込む」という意味です
sales_df = pd.read_csv('sales.csv')
stock_df = pd.read_csv('stock.csv')

# 2つの表を結合します
# mergeは「結合する」という意味です
result = pd.merge(
    sales_df,     # 1つ目の表
    stock_df,     # 2つ目の表
    on='商品名',   # 「商品名」という列をもとに結合します
    how='left'    # 左側(sales_df)の内容を全て残す方式で結合します
)

# 売上金額を計算します
# 個数×単価で売上金額を出します
result['売上金額'] = result['個数'] * result['単価']

# 結果を確認します
print(result)

mergeの使い方をもう少し詳しく

mergeを使うときは、特に以下の2つの設定が重要です。

  1. on: どの列を基準にして結合するかを指定します。

    • 例えば、on='商品名'は「商品名が同じデータどうしをつなげる」という意味です。
    • 商品コードや社員番号など、他の列を使うこともできます。
  2. how: どのように結合するかを指定します。

    • 'left':左側の表のデータは全て残します
    • 'right':右側の表のデータは全て残します
    • 'inner':両方の表に存在するデータだけを残します
    • 'outer':全てのデータを残します(どちらかの表にしかないデータも含む)

実際の動作をもう少し具体的に見てみましょう。

sales_df(売上データ)

商品名 個数
りんご 5
みかん 3
メロン 1

stock_df(在庫データ)

商品名 単価
りんご 100
みかん 80
バナナ 120

これらの表を結合すると、howの設定によって結果が変わります。

how='left'の場合

商品名 個数 単価
りんご 5 100
みかん 3 80
メロン 1 なし

how='inner'の場合

商品名 個数 単価
りんご 5 100
みかん 3 80

似たようなデータを縦につなげたい場合(concat)

例えば、1月から3月までの売上データがそれぞれ別々のCSVファイルにある場合を考えてみましょう。

1月の売上データ(sales_jan.csv)

注文ID 商品名 個数 売上日
1 りんご 5 2024-01-05
2 みかん 3 2024-01-15
3 バナナ 2 2024-01-25

2月の売上データ(sales_feb.csv)

注文ID 商品名 個数 売上日
4 りんご 4 2024-02-03
5 みかん 6 2024-02-12
6 バナナ 3 2024-02-28

3月の売上データ(sales_mar.csv)

注文ID 商品名 個数 売上日
7 りんご 3 2024-03-01
8 みかん 5 2024-03-15
9 バナナ 4 2024-03-30

これらの3つの表を一つにまとめたいとき、Excelでは各シートの内容をコピーして一つのシートに貼り付けていく必要があります。データが多いと、この作業はとても大変です。

しかし、pandasのconcatを使えば、以下のコードで簡単に結合できます。

# 1月から3月までの売上データを読み込みます
sales_jan = pd.read_csv('sales_jan.csv')
sales_feb = pd.read_csv('sales_feb.csv')
sales_mar = pd.read_csv('sales_mar.csv')

# 3つの表を縦方向に連結します
all_sales = pd.concat([
    sales_jan,
    sales_feb,
    sales_mar
], ignore_index=True)  # 行番号を1から振り直します

print(all_sales)

このコードを実行すると、以下のような1つの表が作成されます。

注文ID 商品名 個数 売上日
1 りんご 5 2024-01-05
2 みかん 3 2024-01-15
3 バナナ 2 2024-01-25
4 りんご 4 2024-02-03
5 みかん 6 2024-02-12
6 バナナ 3 2024-02-28
7 りんご 3 2024-03-01
8 みかん 5 2024-03-15
9 バナナ 4 2024-03-30

このように、pandasを使えば複数の表を簡単に一つにまとめることができます。
しかも、表の数が10個や20個に増えても、コードはほとんど同じです。新しい月のデータが追加されても、配列の中にファイル名を追加するだけで対応できます。

また、ignore_index=Trueを指定することで、結合後の表の行番号が1から順番に振り直されるので、きれいな表が作成されます。
この引数を指定しないと、元の表の行番号がそのまま使われてしまい、番号が重複する可能性があります。

よくある困ったときの対処法

1. 列の名前が微妙に違う場合

例えば、「 商品名」(先頭に空白がある)と「商品名」のように、微妙に違う場合があります。

# 列名を確認してみましょう
print("売上データの列名:", sales_df.columns)
print("在庫データの列名:", stock_df.columns)

# 列名の空白を削除します
sales_df.columns = sales_df.columns.str.strip()
stock_df.columns = stock_df.columns.str.strip()

2. 商品名などの表記が微妙に違う場合

「りんご」と「リンゴ」のように表記が違う場合もよくあります。

# データの内容を確認してみましょう
print("売上データの商品名:", sales_df['商品名'].unique())
print("在庫データの商品名:", stock_df['商品名'].unique())

# 空白を削除したり、全て大文字に統一したりします
sales_df['商品名'] = sales_df['商品名'].str.strip()
stock_df['商品名'] = stock_df['商品名'].str.strip()

まとめ

pandasのmergeconcatを使えば、Excelでは面倒な作業が簡単になります。

  1. 手作業でのコピペが不要になります
  2. 何度も同じ作業を行う場合は、コードを使い回せます
  3. 大量のデータでも、素早く正確に処理できます

特に以下のような場面で重宝します。

  • 日々の売上データの集計
  • 商品マスターとの突き合わせ
  • 複数の部署から集めたデータの統合

最初は少し難しく感じるかもしれませんが、基本的な使い方を覚えれば、とても便利なツールになります。
ぜひ、みなさんも試してみてください!

Discussion