*当ブログではアフェリエイト広告を利用しています。

python

【Python】pandasを使ってデータを繋げてみる。concatとmergeの使い方を紹介!

pandas_concat_merge
momeq
モー
モー

今回は、データ解析ライブラリであるpandas(パンダス)を使って、複数に別れたデータを繋げる方法を学びたいと思います。

Pythonでデータを扱うとき、データが複数あって、繋げたいと思うときありませんか?

例えば、物販などをしている会社での月ごとに分かれた売上データなどが考えられますね。

これを年単位のデータに繋げれば、分析に使えるかもしれません。

また、会社で保有する顧客データがあり、それと売上データを繋げれば、販売傾向の分析に使えるかもしれません。

このようにデータを繋げ、活用することの重要性がどんどん高まっているように感じます。

ニャー
ニャー

データは、単体で使うわけではなく、組み合わせることで、威力を発揮するんだにゃ。そのためには、まずはきちんとデータを繋げることが大切になるんだにゃ。

モー
モー

そこで、今回は、データ活用の事始めとして、データの繋ぎ方を学びます。単にデータを繋ぐといっても、月毎の売上データのように「縦」に繋ぐ場合と売上と顧客データを繋ぐ「横」に繋ぐ場合が考えられるので、それぞれ見ていきたいと思います。

この記事のポイント
  • データの繋ぎ方を学ぼう
  • 繋げ方には2通り。縦と横の繋げ方がある。
  • pandasではデータフレーム(表形式)に入れたデータを繋げる関数がある。

今回使用するデータ

モー
モー

まず、今回使用するデータについて、説明しておきます。

データは、一番基本的なデータフレームを自分で作りました。idと名前のデータ、idと年齢のデータの2つずつ、計4つ作り、それぞれ縦と横で繋げていきましょう。

idとanimalsのデータ2つ

import pandas as pd
id = [i for i in range(5)]
animals = ["cat", "dog", "monkey", "bird", "horse"]
df1 = pd.DataFrame({'id': id, 'animals': animals})

>> id	animals
 0	0	    cat
 1	1	    dog
 2	2	 monkey
 3	3	   bird
 4	4	  horse
import pandas as pd
id = [i for i in range(5, 10)]
animals = ["lion", "rabbit", "cow", "bear", "mouse"]
df2 = pd.DataFrame({'id': id, 'animals': animals})

>> id	animals
 5	5	   lion
 6	6	 rabbit
 7	7	    cow
 8	8	   bear
 9	9	  mouse

idとageのデータ

import pandas as pd
id = [i for i in range(5)]
age = [4, 3, 6, 1, 8]
df3 = pd.DataFrame({'id': id, 'age': age})

>> id	age
 0	0	  4
 1	1	  3
 2	2	  6
 3	3	  1
 4	4	  8
import pandas as pd
id = [i for i in range(5, 10)]
animals = [7, 2, 3, 5, 0]
df4 = pd.DataFrame({'id': id, 'age': age})

>> id	age
 0	5	  4
 1	6	  3
 2	7	  6
 3	8	  1
 4	9	  8

データを縦方向に結合する(concat)

ニャー
ニャー

まず紹介するのは、pandasの関数であるconcat関数だにゃ。この関数に繋げたいデータを渡すと、2つを繋げてくれるんだにゃ。

pandas.concat(objsaxis=0join=’outer’ignore_index=Falsekeys=Nonelevels=Nonenames=Noneverify_integrity=Falsesort=Falsecopy=True)

concatはたくさんの引数を取りますが、繋げたいデータフレームを配列にして渡せば、繋がって返ってきます。

引数としては、ignore_indexをTrueにしておくことで、インデックスも繋がるので、必須ですね。

それ以外は、状況に応じで使えれば良いと思います。

「axis=1」にすると横でもつながりますが、カラム名を無視して繋がるので、横で繋げる場合は、次に紹介するmergeの方が良いと思います。ちなみに、デフォルトでaxisは0なので、縦で繋げます。

concatでデータを繋ぐ(axis=0#デフォルト)

pd.concat([df1, df2])

>> id	animals
 0	0	    cat
 1	1	    dog
 2	2	 monkey
 3	3	   bird
 4	4	  horse
 0	5	   lion
 1	6	 rabbit
 2	7	    cow
 3	8	   bear
 4	9	  mouse
モー
モー

データを縦に繋ぐことができています。でもインデックスも繋がっていて重複していますね。これではきちんとしたインデックスが取れません。こんなときは次に紹介する「ignore_index」をTrueにしましょう。

concatでデータを繋ぐ(ignore_index=True)

pd.concat([df1, df2], ignore_index=True)

>> id	animals
 0	0	    cat
 1	1	    dog
 2	2	 monkey
 3	3	   bird
 4	4	  horse
 5	5	   lion
 6	6	 rabbit
 7	7	    cow
 8	8	   bear
 9	9	  mouse
ニャー
ニャー

縦に繋げるのはこれで良さそうだにゃ。今回はカラム名があっているからしっかりと繋がっているけど、カラム名が違う場合はどうなるのかにゃ?

concatでデータを繋ぐ(カラム名が異なる場合)

pd.concat([df1, df3], ignore_index=True)

>> id	animals	age
 0	0	    cat	 NaN
 1	1	    dog	NaN
 2	2	 monkey	NaN
 3	3	   bird	NaN
 4	4	  horse	NaN
 5	0	   NaN	4.0
 6	1	   NaN	3.0
 7	2	   NaN	6.0
 8	3	   NaN	1.0
 9	4	   NaN	8.0
モー
モー

正解は、カラム名が合うところは繋がり、合わないところは、NaNで補填されます。

エラーにならないというところは覚えておきましょう。

最後にaxis=1で横に繋げた場合を見ておきます。

concatでデータを繋ぐ(axis=1)

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

>> id	animals	id	age
 0	0	    cat	 0	  4
 1	1	    dog	 1	  3
 2	2	 monkey	 2	  6
 3	3	   bird	 3	  1
 4	4	  horse	 4	  8
ニャー
ニャー

横に繋がっているけど、「id」が重複しているんだにゃ。重複する値がない場合は、いいけど、ちょっと使いづらいかにゃ?

横方向ならmergeの方が使いやすいかもだにゃ。

データを横方向に結合する(merge)

モー
モー

次に紹介するのはmergeです。

merge関数は、繋げたい値を引数として渡すだけで、重複した値を合わせて、横に繋げてくれます。

pandas.merge(leftrighthow=’inner’on=Noneleft_on=Noneright_on=Noneleft_index=Falseright_index=Falsesort=Falsesuffixes=(‘_x’, ‘_y’)copy=Trueindicator=Falsevalidate=None)

mergeでデータを繋ぐ(デフォルト,on=”id”)

pd.merge(df1, df3, on="id")

>> id	animals	age
 0	0	    cat	  4
 1	1	    dog	  3
 2	2	 monkey	  6
 3	3	   bird	  1
 4	4	  horse	  8
ニャー
ニャー

concatと違って、idが重複していないんだにゃ。idなど重複して欲しくない値の場合は、こっちの方が想像どおりの結果だにゃ。

ちなみに、on=”id”とすることで、明示的にidを主キーとして渡していますが、渡さなくとも自動で判別してくれるんだにゃ。

mergeでデータを繋ぐ(異なる値で繋ぐ)

pd.merge(df1, df4)

>> id	animals	age
 #値が消えています。
モー
モー

デフォルトのmergeの場合、表示されなくなってしまうのですね。

このような挙動はしっかりと覚えておきたいです。

でも、このような場合でもhowを使うと繋げることができるので、次で見ておきましょう。

mergeでデータを繋ぐ(異なる値で繋ぐ、howを使う)

モー
モー

howについてはinner, left, right, outerがあり、それぞれどのように繋ぐかを表しています。

ちなみにデフォルトはinnerで、欠損値はNaNで埋まるようになります。

// inner
pd.merge(df1, df4, on="id",  how='inner')

>> id	animals	age
 #値が消えています。

//left
pd.merge(df1, df4, on="id",  how='left')

>>id	animals	age
0	0	cat	NaN
1	1	dog	NaN
2	2	monkey	NaN
3	3	bird	NaN
4	4	horse	NaN

//right
pd.merge(df1, df4, on="id",  how='right')

>>	id	animals	age
0	5	NaN	4
1	6	NaN	3
2	7	NaN	6
3	8	NaN	1
4	9	NaN	8

//outer
pd.merge(df1, df4, on="id",  how='outer')

>> id	animals	age
0	0	cat	NaN
1	1	dog	NaN
2	2	monkey	NaN
3	3	bird	NaN
4	4	horse	NaN
5	5	NaN	4.0
6	6	NaN	3.0
7	7	NaN	6.0
8	8	NaN	1.0
9	9	NaN	8.0
ニャー
ニャー

今回は、よく使う使い方だけ見てきたんだにゃ。concatもmergeも引数はたくさんあるから、使い方を見ながら必要な引数を追加して欲しいんだにゃ。

プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

TechAcademy [テックアカデミー]

モー
モー

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。

TechAcademyのおすすめポイント
  • オンラインで選抜された現役エンジニアから学ぶことができる
  • 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
  • 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている
ニャー
ニャー

無料体験や相談もあるから、一度試してみてもいいんだにゃ!

\無料体験、無料相談はこちらから/



記事URLをコピーしました