【Pandas入門】DataFrameをいろんな方式で結合するpd.concat!

こんにちは、インストラクターのフクロウです!Pandasで2つ以上のDataFrameを結合する関数はいろいろありますが、その中でもシンプルな機能で使いやすい(と、個人的に思っている)np.concatを紹介します!この記事では

  • np.concateとは?
  • axisパラメータの使い方
  • joinの2つのオプション「innerとouter」


について紹介しますよ!この3つのポイントがわからないよ!って人はぜひこの記事を読んでください!読んで簡単Pandas力アップです!

目次

サンプルデータの作成

まずは例題に使うデータを作っておきます。

In [1]:
# ライブラリをインポート
import pandas as pd
import numpy as np

# データの作成
data = [
    [180, 160, 170],             # 身長
    [80, 50, 70],                # 体重
    [20, 19, 18],                # 年齢
]
name = ["tarou","jirou", "saburou"] # 名前

# DataFrameにデータを格納
data = np.array(data)
df1 = pd.DataFrame(data[[0,1]].T, columns=["身長", "体重"])
df1.index = name

# DataFrameの表示
df1
Out[1]:
身長 体重
tarou 180 80
jirou 160 50
saburou 170 70
In [2]:
# サンプルのDataFrame2つ目を作成
df2 = pd.DataFrame(data[[0,2]].T, columns=["身長","年齢"]) 
df2.index = name 

# DataFrameの表示 
df2
Out[2]:
身長 年齢
tarou 180 20
jirou 160 19
saburou 170 18

pd.concatの使い方

concatはDataFrameを結合する関数です。

※concatenateとは
主な意味:(…を)鎖状につなぐ
引用元:weblio https://ejje.weblio.jp/content/concatenate

一概に「結合する」と言っても、方法がいろいろあります。基本的には結合したいデータフレームをリストにまとめて第一引数に渡し、縦方向に連結するか、横方向に連結するかをaxisで指定します。

また、結合の際に重複を許すか共通部分のみにするかをjoin引数で指定します。

axisを使って結合の方向を指定

axisを使うことで列や行方向のどちらに結合するかを決めることができます。axis=1とすると列方向に結合することができます。

In [3]:
pd.concat([df1, df2], axis=1)
Out[3]:
身長 体重 身長 年齢
tarou 180 80 180 20
jirou 160 50 160 19
saburou 170 70 170 18

身長が重複していますね。次にaxis=0で行方向に結合!

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

[注意が出てきます]

/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  """Entry point for launching an IPython kernel.
Out[4]:
体重 年齢 身長
tarou 80.0 NaN 180
jirou 50.0 NaN 160
saburou 70.0 NaN 170
tarou NaN 20.0 180
jirou NaN 19.0 160
saburou NaN 18.0 170

名前が重複していることがわかりますね。また、結合の結果新しくできた部分にはNaNが入ります。(ここ注意!)

joinを使って重複の扱いを決める

join=”innter”で共通部分のみを残す

In [5]:
pd.concat([df1, df2], join="inner")
Out[5]:
身長
tarou 180
jirou 160
saburou 170
tarou 180
jirou 160
saburou 170

この例だと「身長」列だけが残ります。

join=”outer”ですべての要素を残す

In [6]:
pd.concat([df1, df2], join="outer")
[注意が出てきます]
/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  """Entry point for launching an IPython kernel.
Out[6]:
体重 年齢 身長
tarou 80.0 NaN 180
jirou 50.0 NaN 160
saburou 70.0 NaN 170
tarou NaN 20.0 180
jirou NaN 19.0 160
saburou NaN 18.0 170

outerを指定すると、特に何もして指定しなかったIn[4]と同じ結果になります。ちなみにaxis=1すると以下の通り。

In [7]:
pd.concat([df1, df2], axis=1, join="outer")
Out[7]:
身長 体重 身長 年齢
tarou 180 80 180 20
jirou 160 50 160 19
saburou 170 70 170 18
In [8]:
pd.concat([df1, df2], axis=1, join="inner")
Out[8]:
身長 体重 身長 年齢
tarou 180 80 180 20
jirou 160 50 160 19
saburou 170 70 170 18

まとめ

この記事では、DataFrameを結合する関数であるpd.concatを解説しました。pd.concatは縦でも横でも簡単にDataFrameをくっつけることができる関数です。

この関数では特にjoinパラメータが特殊なので、ここに注目して覚えておくことをオススメします!

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次