【Pandas】Excelでは面倒なデータ結合を簡単に実現する方法📊
はじめに
「複数のExcelシートのデータを一つにまとめるのが大変...」
「VLOOKUPやPowerQueryは使いこなせないけど、なんとかデータを連結したい...」
「シートが増えるたびに手作業でコピペするのがつらい...」
こんな経験はありませんか?
私は、Excelで別々のシートにあるデータを一つの表にまとめようとして、いつも苦労していました。
そんな悩みを解決するのが、今回ご紹介する「pandas」というPythonのライブラリです。
pandasは、Excelのような表データを扱うためのツールで、特に複数の表をつなぎ合わせる作業が得意です。
pandasの表結合は何がすごいの?
pandasには、表をつなぎ合わせるための2つの便利な機能があります。
- merge(マージ): 共通の項目(例:商品名や社員番号など)をもとに、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つの設定が重要です。
-
on: どの列を基準にして結合するかを指定します。
- 例えば、
on='商品名'
は「商品名が同じデータどうしをつなげる」という意味です。 - 商品コードや社員番号など、他の列を使うこともできます。
- 例えば、
-
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のmerge
とconcat
を使えば、Excelでは面倒な作業が簡単になります。
- 手作業でのコピペが不要になります
- 何度も同じ作業を行う場合は、コードを使い回せます
- 大量のデータでも、素早く正確に処理できます
特に以下のような場面で重宝します。
- 日々の売上データの集計
- 商品マスターとの突き合わせ
- 複数の部署から集めたデータの統合
最初は少し難しく感じるかもしれませんが、基本的な使い方を覚えれば、とても便利なツールになります。
ぜひ、みなさんも試してみてください!
Discussion