超初心者向けPython入門講座

仕事の効率化などにpythonを使いたい!けど何から始めらばよいか分からない、といった初心者の方向けに、pythonの導入から実用的な使い方まで、極力分かりやすくまとめたサイトです。

pandas python

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と同じにするだけで解決できます!

 

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

では実際にプログラムを動かして確認してみましょう。
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の配列を縦方向に結合させることが出来るようになりましたね。

Point
  • 配列を縦に結合するためには、「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の配列を横方向にも結合させることが出来るようになりましたね。

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

 

 

4. まとめ

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

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

 

ちなみに、このサイトでは初心者の方向けに「Python初心者入門講座」という講座を作っていますので、気になった方はそちらもご覧いただけると幸いです。

スポンサーリンク




スポンサーリンク




-pandas, python
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

第15章 Pythonでグラフを作成してみよう(matplotlib)

この章では、いよいよPythonを使ったグラフの作成について解説したいと思います。 解説内容 matplotlibの使い方を学ぼう 簡単なグラフを作成してみよう グラフにタイトルや軸ラベルを表示させよ …

Pandasとnumpyの違いや変換について(どっちを使えばいいの?)

今回は、Pyhonでデータを扱う際に使えるととても便利な「Pandas」について、同じくデータを扱う際に使用する代表的なライブラリである「numpy」と比較して解説したいと思います。 「Pandas」 …

Pythonで2次元の平面分布図を作成しよう(matplotlib)

matplotlibは、Pythonでグラフを作成する際に便利なライブラリです。 ここでは、matplotlibを用いて、Pythonで平面的な分布図を作成する方法について解説したいと思います。 解説 …

第4章 Pythonのループ処理(for)を使ってみよう

この章では、いよいよ「ループ処理」を使っていこうと思います! 解説内容 ループ処理って何? ループ処理を使ってみよう ループ処理の範囲 rangeによるループ処理の応用 listを用いたループ処理   …

第11章 Pythonでテキストファイルを読み込んでみよう(read、readlines、readline)

9章では、「input」を使ってプログラムの外から値を入力しましたね。この章では、「テキストファイル」からのデータの読み込みについて解説したいと思います。(次章では「csvファイル」の読み込みについて …

スポンサーリンク


初めまして、サイトを運営しているキユと申します。

このサイトでは、まったくの初心者がPythonを使って、単純作業や仕事を効率化できるようになるまでに必要なことをまとめています。