Pandas入門講座|12.データフレームの結合方法(concat)【PythonのライブラリPandas】

はじめに

こんにちは。キノコードです。
この動画では、Pandasの結合の2本目です。
結合とは、2つのデータフレームをくっつけることです。
前回のレッスンで説明をしたmergeメソッドは、共通するカラムをキーとして2つのデータフレームを1つにしました。
mergeメソッドは、データフレーム同士を横に結合する方法でした
簡単にいうと、concatメソッドは、データフレーム同士を縦に結合させる方法です。
Pandasのデータ加工、人工知能のデータ前処理などでよく使われるメソッドです。
それではパソコン画面に切り替えてレッスンを進めていきます。

ライブラリのインポート

import pandas as pd

まず、Pandasをインポートする記述を書きます。
「as」を使ってPandasを「pd」という名前で使えるようにしましょう。
実行します。

import warnings
warnings.filterwarnings(‘ignore’)

あとのソースコードで出てきますが、結合するカラムが一致していないときにwarning、つまり警告がでてくることがあります。
そのwarningがでていても処理には影響はありません。
しかし、jupyter labが読みづらくなってしまうので、warningを表示させない設定にしましょう。
warningsというライブラリをインポート。
その上で、warningsドットfillterwarings、無視という意味のイグノアを書きましょう。

データフレームの作成

df01 = pd.DataFrame( {‘氏名’:[‘佐藤’, ‘鈴木’, ‘高橋’, ‘田中’],
‘クラス’:[‘df01’, ‘df01’, ‘df01’, ‘df01’],
‘数学’: [1, 2, 3, 4],
‘国語’:[5, 6, 7, 8]})
df01

結合のためにデータフレームを作成しましょう。
まず1つ目のデータフレームを作成します。
df01というクラスの佐藤さん、鈴木さん、高橋さん、田中さんが受けた数学と国語のテスト結果のデータフレームを作成しましょう。
点数は、わかりやすさのために1234とします。実行します。このようなデータフレームです。

df02 = pd.DataFrame( {‘氏名’:[‘伊藤’, ‘渡辺’, ‘山本’],
‘クラス’:[‘df02’, ‘df02’, ‘df02’],
‘数学’: [9, 10, 11],
‘国語’:[12, 13, 14]})
df02

2つ目のデータフレームです。
df02というクラスの伊藤さん、渡辺さん、山本さんが受けた数学と国語のテスト結果のデータフレームを作成します。
このようなデータフレームです。

pd.concat([df01, df02])

それでは早速、df01とdf02のテーブルを結合させてみましょう。
pd.concatと書いて丸括弧。丸括弧の中に、結合したいデータフレームをリストで記述します。
実行します。結合できました。
簡単でしたね。
ただし、色々工夫ができますので、みていきましょう。

結合後のインデックス

pd.concat([df01, df02], ignore_index=True)

先ほどのデータフレームは、それぞれのデータフレームのインデックスをそのまま使っていました。
インデックス番号を再度振り直すには、ingore_indexの引数にTrueを渡します。
実行します。
インデックス番号が振り直されました。

3つのデータフレームを結合

df03 = pd.DataFrame( {‘氏名’:[‘中村’, ‘小林’, ‘加藤’],
‘クラス’:[‘df03’, ‘df03’, ‘df03’],
‘数学’: [15, 16, 17],
‘国語’:[18, 19, 20]})
df03

concatでは、2つ以上のデータフレームを結合することができます。
試しに、3つのデータフレームを結合させてみましょう。
そのために、3つ目のデータフレームを作成します。
このようなデータフレームです。

pd.concat([df01, df02, df03])

複数のデータフレームを結合の方法は簡単です。
結合したいデータフレームをリストにするだけです。
実行します。
クラスがデータフレームの名前なので、複数のデータフレームが結合されていることがわかります。

インデックスにラベルを追加

pd.concat([df01, df02, df03],keys=[‘df01′,’df02′,’df03’])

今回はカラム名のクラスにデータフレームを名前をそのまま書いてあるので、元のデータフレームがなんだったかわかります。
しかし、このカラムがなかったら、元のデータフレームがなんなのかわからなくなります。
その場合は、keysという引数に任意の名前のリストを渡します。
そのリストの名前がマルチインデックスになります。1番目、2番目、3番目という名前にしましょう。
実行します。
keysで指定した名前がインデックスとして表示されています。
ちなみに、マルチインデックスとは、その名前の通り、複数のインデックスという意味です。

df.index

インデックスを確認してみましょう。
MultiIndexとなっています。
このようにデータフレームは複数のカラムをインデックスに指定することができます。
この機会にMultiIndexという単語だけでも覚えておきましょう。

共通しないカラムを持つデータフレームの結合

df04 = pd.DataFrame( {‘氏名’:[‘吉田’, ‘山田’, ‘佐々木’],
‘クラス’:[‘df04’, ‘df04’, ‘df04’],
‘数学’: [21, 22, 23],
‘社会’:[24, 25, 26]})
df04

さて、もう1つデータフレームを作成してみましょう。
今までのデータフレームは、数学と国語の教科のデータフレームでした。
今度は、数学のカラム名はそのまま、国語のカラム名をではなく社会のテスト結に変更をして、名前は吉田さん、山田さん、佐々木さんのデータフレームを作成しましょう。
このようなデータフレームです。

df01

ちなみに、df01のデータフレームはこのようなデータフレームでした。
つまり、氏名、クラス、数学のカラムは共通していますが、国語と社会のカラムは共通していません。このようなデータフレームをconcatで縦に結合するとどのような結果になるでしょうか。

pd.concat([df01, df04])

実行してみましょう。
このような結合結果です。

氏名とクラス、数学は共通するカラムなので結合されました。
しかし、共通していない国語と社会のカラムは、それぞれデータがない部分がNaNとなっています。
つまり、共通するカラムは結合されて、共通していないカラムはNaNが代入されています。

outerで結合(デフォルト)

pd.concat([df01, df04],join=’outer’)

concatでは、結合方法を指定することができます。
joinという引数で指定することができます。
デフォルトでは、joinがouterとなっています。
実行してみましょう。同じ結果になるはずです。
同じ結果となりました。
つまり、データフレーム同士で違うカラムがあったとしても縦に結合をするという結合方法です。

innerで結合

pd.concat([df01, df04],join=’inner’)

一方、innerという結合方法もあります。
これは同じカラムがあった場合のみ結合をして、どちらかにないカラムについては結合をせずに結合結果のデータフレームからは除外をするという方法です。
実行してみましょう。
共通する氏名、クラス、数学のカラムのみ結合されており、それぞれのデータフレームにしかない国語と社会のカラムは除外されています。

縦方向の結合(デフォルト)

pd.concat([df01, df04],axis=0)

結合方向を指定することもできます。
axisに1を渡すと横方向に結合でき、axisに0を渡すと縦方向に結合することができます。
デフォルトはaxisが0です。試してみましょう。実行します。縦方向に結合することができました。

pd.concat([df01, df04],axis=’index’)

axisの0だと縦?横?と迷ってしまうかもしれません。
その場合は、0ではなくindexと指定すれば良いです。インデックスは縦方向にふられているものですよね。つまりindex方向に結合をすると覚えてしましょう。
実行してみましょう。
先ほどの結果と同様に縦方向に結合することができました。

横方向の結合

pd.concat([df01, df04],axis=’columns’)

次にaxisに1、あるいはcolumnsを渡すと横方向に結合することができます。実行してみましょう。
横方向に結合することができました。
これはインデックスをキーに結合しています。

4つのデータフレームを横に結合

pd.concat([df01, df02, df03, df04],axis=’columns’)

mergeメソッドは2つのデータフレーム同士しか結合することができませんでした。
concatメソッドは複数のデータフレームを結合できるということをみてきました。
4つのデータフレームを結合をしてみましょう。
結合することができました。

pd.concat([df01, df02, df03, df04],axis=’columns’,join=’inner’)

引数joinでinnerを指定するとインデックスが共通しているもののみ結合することができます。
実行してみます。
共通しているインデックスのみ結合することができました。

df01.set_index(‘氏名’)

df01~df04までのすべてのデータフレームのインデックスを氏名に変更します。
インデックスを変更するにはset_indexを記述して、丸括弧の中にインデックスに設定したいカラムを記述します。
実行します。

df04

df04を表示させてみましょう。氏名をインデックスに設定することができています。

pd.concat([df01, df02, df03, df04],axis=’columns’,join=’inner’)

これをもう一度、先ほどのaxisをcolumns、joinをinnerにして実行をしてみましょう。
実行します。
df01~df04で共通しているインデックスは佐藤さん、鈴木さんです。共通するインデックスのみ結合ができています。

concatメソッドとmergeメソッド

前回ののレッスンではmergeメソッドについて説明をしました。
このレッスンでみたように、concatはmergeメソッドとは違い、縦方向であっても結合することができます。
また、3つ以上のデータフレームを結合することができます。
一方、concatメソッドは、mergeメソッドと違い、2つ以上のカラムをキーに結合することができません。また、leftやrightの結合方法はありません。
したがって、縦方向の結合や1つのカラムをキーに、3つ以上のデータフレームを結合した場合はconcat。2つ以上のカラムをキーに結合した場合やleftやrightで結合したい場合は、mergeメソッドを使うとよいでしょう。
キノコードでは業務自動化のためのPython講座があります。ほかの動画も気になる方がいればぜひご覧ください。
また、人工知能の動画や株や為替の分析方法の動画もアップしていく予定です。
新着通知がいきますので、ぜひチャンネル登録をお願いします。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

Jupyter Labのファイルはこちら