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


今回は、データ解析ライブラリである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(objs, axis=0, join=’outer’, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=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(left, right, how=’inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=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(テックアカデミー)ですね。
- オンラインで選抜された現役エンジニアから学ぶことができる
- 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
- 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている

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