【Python初心者】 直感的に理解できるデータの結合 concat・merge

スポンサーリンク
Python

ゼロ知識の初心者がデータサイエンスを完全無料で学習する方法5選

初心者に人気のプログラミング言語Pythonは独学可能か?

データ分析において必須のスキルは、前処理です。前処理とはデータの分析しやすい形に整えるための作業です。
前処理の中で、データを結合する作業があります。例えば、データベースから、取り出したデータは1つだけではなく、多くのデータを取り出し、データ同士を繋げる必要があります。
今回はデータの結合について直感的に理解しやすいように解説していきます。

データを作る

df1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],
                   'data_1':range(7)})

df2 = pd.DataFrame({'key':['a','b','d'],
                    'data_1':range(3)})
df1

出力:

df2

出力:

df1は6行×2列のデータフレーム

df2は3行×2列のデータフレームを作りました。

concatを使ってデータを結合する

pd.concat([df1, df2], axis=1)

出力:

こんな感じでデータが結合されました。

詳しくみてみましょう。

以下の図では、df1は緑枠のデータ、df2はオレンジ枠のデータです。

df1とdf2が結合されますた。

しかし単純に、横に引っ付けただけです。青枠はデータがないので、NaNである欠損値になっています。このように横に引っ付けるだけの結合は、実際に使うことはほぼないです。

次に、「axis= 」の値を1から0に変えてみましょう。

pd.concat([df1, df2], axis=0)

出力:

今後はdf1とdf2が縦に結合されました。

詳しくみてみましょう。

単純に縦にデータが引っ付いています。

こんな感じでデータが縦に引っ付くためには、データの変数(カラム)の名前が一致していないといけません。今回は、「key」と「data_1」で、一致しています。

ではデータの変数が違うデータフレームを作って、変数名が違うデータフレーム同士を結合してみましょう。

df3 = pd.DataFrame({'key':['a','b','d'],
                    'data_2':range(3)})
df3

出力:

変数名が違うデータフレームができました。

では、今までと同じようにconcatでデータを結合してみましょう。

pd.concat([df1, df3], axis=0)

出力:

一応結合できました。しかし、一見しただけでも、少しおかしそうですね。NaNの数が多いです。

詳しくみてみましょう。

df1とdf3では変数名が違うため(df1はkeyとdata_1、df3はkeyとdata_2)、結合した結果、値がない時はNaNになってしまいます。

keyは同じデータなので、上手く結合できています。このような場合は、mergeを使います。

mergeを使ってデータを結合する

pd.merge(df1, df3)

出力:

なんとなく、上手くデータが結合できましたね。

今回はデフォルトですが、df1とdf3で共通している「key」という変数を元に結合しています。

分かりやすく、key」を元に結合するように、あえて指定してみましょう。

pd.merge(df1, df3, on='key')

出力:

on=’key’ で指定しました。同じ結果ですね。

詳しくみてみましょう。

まずは、変数の「key」から確認してみます。

結合後の「key」は、bとaになっています。「key」という変数はdf1がa, b, cがあり、df3はa, b, dがあります。df1とdf3で共通しているa, bのみが使われていることが確認できます。

そして、「key」が結合されてから、その「key」に当てはまるように、「data_1」と「data_2」が表されます。

df1のbは「data_1」の0、1、6が抽出されています。

df2のbは「data_2」の1が出力されています。この場合は、1は一つなので「data_1」の数に対応するように、三つに複写されます。

df1のaは「data_1」の2、4、5が抽出されています。

df2のaは「data_2」の0が出力されています。この場合も、0は一つなので「data_1」の数に対応するように、三つに複写されます。

結合する場合は、keyが必要ですが、keyの結合の種類は4つの種類があり、指定できます。(outer, inner, left, right)それぞれの違いを見てみましょう。

merge(innter)

pd.merge(df1, df3, how='inner')

出力:

innterはデフォルトなので、上で説明しました内容と同じですね。

merge(outer)

pd.merge(df1, df3, how='outer')

出力:

7行×3列で表示されました。

詳しくみてみましょう。

df1の「key」であるa, b, cと、df3の「key」であるa, b, dがすべて抽出されています。

それぞれ、数値がない項目にNaNがあります。

つまり、outerは「Key」はすべて使うという意味です。

merge(left)

pd.merge(df1, df3, how='left')

出力:

6行×3列で表示されました。

詳しくみてみましょう。

df1の「key」であるa, b, cが抽出され、df1と同じ「key」であるa, bが、df3から数値が抽出されていることが分かります。

つまり、leftは、merge(df1, df3)の左(この場合はdf1)の「key」をすべて抽出するという意味です。

merge(right)

pd.merge(df1, df3, how='right')

出力:

df3の「key」であるa, b, dが抽出され、df3と同じ「key」であるa, bが、df1から数値が抽出されていることが分かります。

つまり、rightは、merge(df1, df3)の右(この場合はdf2の「key」をすべて抽出するという意味です。

データ分析するためには色々なデータを結合させる必要があります。データを結合させることは、基本的に簡単なコードで可能ですが、コードの特性をよく理解していないと間違った結合をしてしまう可能性があります。

今回は、非常に簡単なデータなので、違いが分かりやすいですが、実際は多くのデータがあるので、結合が間違っていても気が付かない可能性があります。

特性をよく理解してから結合していくように気を付けて下さいね。

【Python初心者】直感的に理解できるfor文

【Python初心者】直感的に理解できるif文

Python初心者でも直感的にできるデータの抽出方法

コメント

タイトルとURLをコピーしました