PythonのPandasで配列を結合しよう(行列名が違うor空白の場合も対応)

今回は、Pythonのライブラリである「pandas」で使用する配列の結合について説明したいと思います。

pandasで複数のデータを読みこんで処理したりする場合に必要な知識となります。 

目次

1. 使用する関数(concat,merge, join)

まず、pandasの配列の結合に使う関数について解説します。

pandasの配列を結合するには、「concat」、「 merge」、「join」などの関数があり、結合する方向は下の表の通りです。

関数結合方向
concat縦、横どちら方向にも結合可能
merge横方向に結合
join縦方向に結合

 

細かい違いはありますが、上の表で説明したように「concat」を用いることで縦横どちらにも結合が可能です。そこで、次項意向では「concat」を用いた配列の結合について説明していきます。 

2. 配列を縦(行方向)に結合しよう

ではまず、配列を縦(行方向)に結合する方法について解説していきます。 

2.1. 列名が同じ場合の結合

まずは列名が同じ配列を縦に結合する場合についてです。

今回は、下のような2つの配列を準備して結合してみましょう。

 

配列を縦に結合するためには、「pd.concat([配列1, 配列2], axsis=0)」というように書きます。

では、実際に結合してみましょう。下のコードを実行してください。

import pandas as pd

df1 = pd.DataFrame({"山田": [60, 55, 80],
                  "田中" : [90, 80, 67],
                  "上田" : [78, 35, 50]},
                  index = ["数学", "英語", "理科"])

df2 = pd.DataFrame({"山田": [96, 89],
                  "田中" : [67, 46],
                  "上田" : [78, 80]},
                  index = ["国語", "社会"])

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

すると、下のように縦方向に結合された配列が出力されたと思います。

 

ポイントは、「concat」で結合する時に、「axis=0することです。

ただし、縦方向に結合する場合は 、このaxis=0 はデフォルトなので省略は可能です。

ただし、後で解説する横方向に結合する場合と間違わないように、最初は記述して覚えることお勧めします。

 

ここで、列名が違う場合はどうなるのでしょうか。

例えば、片方のデータに列名がついていない場合を想定して、下のプログラムを回してみましょう。

import pandas as pd

df1 = pd.DataFrame({"山田": [60, 55, 80],
                  "田中" : [90, 80, 67],
                  "上田" : [78, 35, 50]},
                  index = ["数学", "英語", "理科"])

df2 = pd.DataFrame([[96, 67, 78],[89, 46, 80]],
                  index = ["国語", "社会"])

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

すると下のように別名の列ができ、データの無い場所がNaNになってしまったと思います。

このように、concatでデータを縦に結合する際は列名を基準にしているため、列名がそろっていないと新たな列が作られ、データの無い箇所はNaNになります。

  

ただ逆に言うと、列名を基準にしているため、2つ目の配列の列の順番が1つ目と違っていてもちゃんと結合してくれます。 

2.2. 列名が違う(列名が空白)場合の結合

先ほどの解説で、concatで縦に結合する際は列名を基準にしていると解説しました。

この機能により、列の順番がばらばらでも簡単にデータを結合させることが出来ますが、列名が違ったり空白であったりする場合に縦に並べて結合させたいこともありますね。

 

ただし、この場合は実は簡単で、列名を基準にしているなら列名を同じにしてしまえばいいだけです!

鋭い人はすでに気が付いているかもしれませんが、列を結合させる「pd.concat」の前に「配列1.columns=配列2.columns」として配列2の列名を配列1と同じにするだけで解決できます!

 

列名の指定に関して不安がある方は、下のページで解説しているので、良ければそちらもご覧ください。

あわせて読みたい
Pandasの基本(dataframe作成、データ抽出、csv読み込み等) 今回は、Pyhonでデータを扱う際に使えるととても便利な「Pandas」について解説したいと思います。 また、データを扱う際に使用する代表的なライブラリとして「numpy」が...
では実際にプログラムを動かして確認してみましょう。
import pandas as pd

df1 = pd.DataFrame({"山田": [60, 55, 80],
                  "田中" : [90, 80, 67],
                  "上田" : [78, 35, 50]},
                  index = ["数学", "英語", "理科"])

df2 = pd.DataFrame([[96, 67, 78],[89, 46, 80]],
                  index = ["国語", "社会"])

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

ちゃんと結合することが出来ました!

これでpandasの配列を縦方向に結合させることが出来るようになりましたね。

  • 配列を縦に結合するためには、「pd.concat([配列1, 配列2], axsis=0)」とする
  • concatでデータを縦に結合する際は列名を基準にしている
  • 列名が違ったり空白の場合は、「配列1.columns=配列2.columns」として列名を合わせることで下に並べて結合することが可能

 

3. 配列を横(列方向)に結合しよう

次に、配列を横(列方向)に結合する方法について解説します。

縦方向への結合の時に少し触れましたが、基本は縦方向への結合と同じで、「concat」で結合する際に「axis=1」とすることで横方向へ結合できます。

では、詳しく解説していきましょう。

 

3.1. 行名が同じ場合の結合

配列を縦に結合する際は列名が基準でしたが、配列を横に結合する際は行名が基準となります。

まずは下2つの配列を結合してみましょう。

今回は、行名が基準となっていることが分かりやすいように、行の順番を変えています。

import pandas as pd

df1 = pd.DataFrame({"山田": [60, 55, 80],
                  "田中" : [90, 80, 67],
                  "上田" : [78, 35, 50]},
                  index = ["数学", "英語", "理科"])

df2 = pd.DataFrame({"井手": [96, 89, 92],
                  "山本" : [67, 46, 55],
                  "小田" : [78, 80, 57]},
                  index = ["理科", "数学", "英語"])

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

すると、下のようにちゃんと横方向に結合することが出来ました。

後から結合した配列も、それぞれの行名に対応した数字が入っていますね。

 

ここでのポイントは、 「concat」で結合する際に「axis=1」とすることと、結合する際は行名が基準となっていることの2つです。

 

では、列名が無い場合はどうなるか確認してみましょう。

2つ目の配列の行名を抜いて結合してみます。

import pandas as pd

df1 = pd.DataFrame({"山田": [60, 55, 80],
                  "田中" : [90, 80, 67],
                  "上田" : [78, 35, 50]},
                  index = ["数学", "英語", "理科"])

df2 = pd.DataFrame({"井手": [89, 92, 96],
                  "山本" : [46, 55, 67],
                  "小田" : [80, 57, 78]},
                  )

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

すると、下のようにやはり別の行が追加され、データが無い箇所はNaNになりました。

(ここは縦に結合した際と同じですね。)

 

3.2. 行名が違う(行名が空白)場合の結合

先ほど行名が違う(空白)の配列を結合しようとすると、新たな行が追加されて、 データが無い箇所はNaNになりました。

そこで最後に、行名が違う(行名が空白)場合の結合について説明しようと思います。

といっても縦に結合した際とやることはほぼ同じなので、すでにお気づきの方もいらっしゃるとは思いますが。

 

結論から言うと、「concat」で横方向に結合する前に「配列2.index = 配列1.index」として、行名をそろえるだけです。

では実際に確認してみましょう。

import pandas as pd

df1 = pd.DataFrame({"山田": [60, 55, 80],
                  "田中" : [90, 80, 67],
                  "上田" : [78, 35, 50]},
                  index = ["数学", "英語", "理科"])

df2 = pd.DataFrame({"井手": [89, 92, 96],
                  "山本" : [46, 55, 67],
                  "小田" : [80, 57, 78]},
                  )

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

上のプログラムを実行すると、下のようにちゃんと結合することが出来ました。

「 3.1. 行名が同じ場合の結合 」で解説した結果と同じですね。

これで、これでpandasの配列を横方向にも結合させることが出来るようになりましたね。

  • 配列を横に結合するためには、「pd.concat([配列1, 配列2], axsis=1)」とする
  • concatでデータを縦に結合する際は行名を基準にしている
  • 行名が違ったり空白の場合は、「配列2.index = 配列1.index」として行名をそろえることで横に並べて結合することが可能

4. まとめ

今回は、Pythonのライブラリである「pandas」で使用する配列の結合について説明しました。

pandas」はデータ整理などでは必ずと言ってよいほどよく利用するライブラリなので、いろいろな使い方をしっかりとマスターしていきましょう。

 

また、このサイトでは初心者の方向けに「プログラミングのお勧め学習法」も紹介していますので、気になった方はそちらもご覧いただけると幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

このブログを運営している人

非エンジニア職の社会人です。
業務の単純作業が苦手で、何とかしたいと思いプログラミングを習得しました。
このサイトが同じ悩みを抱える人の助けになれば良いなと考えています。

コメント

コメントする

目次