Open In Colab

データの結合#

本節では Series および DataFrame を結合する方法について学びます。

データを結合する方法は次の2つに分類されます。

  • 縦に連結

  • 横に連結

データを横に結合する場合、次のいずれかをキーとして結合します。

  • インデックス(行のラベル)

  • 特定の列

Seriesの結合#

import pandas as pd

s1 = pd.Series([1, 2, 3], index=list("abc"))
s2 = pd.Series([10, 20, 30], index=list("acd"))

Seriesを縦に結合する場合は concat 関数を実行します。 concat 関数には結合対象となるオブジェクトが格納されたリストを渡します。

pd.concat([s1, s2])
a     1
b     2
c     3
a    10
c    20
d    30
dtype: int64

引数 ignore_indexTrue を渡すと、インデックスを振り直します。

pd.concat([s1, s2], ignore_index=True)
0     1
1     2
2     3
3    10
4    20
5    30
dtype: int64

DataFrame のコンストラクタから生成する場合は、複数の Series をリストなどに格納して渡します。

pd.DataFrame([s1, s2])
a b c d
0 1.0 2.0 3.0 NaN
1 10.0 NaN 20.0 30.0
pd.DataFrame([s1, s2]).T
0 1
a 1.0 10.0
b 2.0 NaN
c 3.0 20.0
d NaN 30.0

SeriesとDataFrameの結合#

df1 = pd.DataFrame(
    [[1, 10, 100], [2, 20, 200], [3, 30, 300]], index=list("abc"), columns=list("ABC")
)
df1
A B C
a 1 10 100
b 2 20 200
c 3 30 300

DafaFrameSeries を縦に結合するには concat 関数を実行します。

pd.concat([df1, s1])
A B C 0
a 1.0 10.0 100.0 NaN
b 2.0 20.0 200.0 NaN
c 3.0 30.0 300.0 NaN
a NaN NaN NaN 1.0
b NaN NaN NaN 2.0
c NaN NaN NaN 3.0

DafaFrameSeries を横に結合するには concat 関数の引数 axis1 を渡して実行します。

pd.concat([df1, s1], axis=1)
A B C 0
a 1 10 100 1
b 2 20 200 2
c 3 30 300 3

DataFrame の列に代入する方法もあります。この場合は元の DataFrame を破壊的に書き換えます。

df1_copy = df1.copy()
df1_copy["S1"] = s1
df1_copy
A B C S1
a 1 10 100 1
b 2 20 200 2
c 3 30 300 3
df1_copy["S2"] = s2
df1_copy
A B C S1 S2
a 1 10 100 1 10.0
b 2 20 200 2 NaN
c 3 30 300 3 20.0

DataFrameとDataFrameの結合#

df2 = pd.DataFrame(
    [[4, 10, 100], [2, 20, 200], [3, 30, 400]], index=list("acd"), columns=list("ACD")
)
df1
A B C
a 1 10 100
b 2 20 200
c 3 30 300
df2
A C D
a 4 10 100
c 2 20 200
d 3 30 400

DataFrame どうしを縦に結合する場合は concat 関数を実行します。

pd.concat([df1, df2])
A B C D
a 1 10.0 100 NaN
b 2 20.0 200 NaN
c 3 30.0 300 NaN
a 4 NaN 10 100.0
c 2 NaN 20 200.0
d 3 NaN 30 400.0

引数 ignore_indexTrue を渡すと、インデックスを振り直します。

pd.concat([df1, df2], ignore_index=True)
A B C D
0 1 10.0 100 NaN
1 2 20.0 200 NaN
2 3 30.0 300 NaN
3 4 NaN 10 100.0
4 2 NaN 20 200.0
5 3 NaN 30 400.0

concat 関数を実行して DafaFrame を横に結合する場合は、引数 axis1 を渡します。

この場合、 インデックスがキー になります 。

pd.concat([df1, df2], axis=1)
A B C A C D
a 1.0 10.0 100.0 4.0 10.0 100.0
b 2.0 20.0 200.0 NaN NaN NaN
c 3.0 30.0 300.0 2.0 20.0 200.0
d NaN NaN NaN 3.0 30.0 400.0

特定の列をキー として、 DataFrame を横に結合する場合には merge メソッドを実行します。引数 on にキーとなる列名を指定します。

pd.merge(df1, df2, on="A")
A B C_x C_y D
0 2 20 200 20 200
1 3 30 300 30 400

キーとなる列名が異なる場合には、引数 left_on および引数 right_on にそれぞれ列名を指定します。

pd.merge(df1, df2, left_on="C", right_on="D")
A_x B C_x A_y C_y D
0 1 10 100 4 10 100
1 2 20 200 2 20 200

merge メソッドの結合方法はデフォルトで内部結合(inner)です。結合方法は引数 how で指定します。

  • left: 左外部結合

  • right: 右外部結合

  • outer: 外部結合

pd.merge(df1, df2, on="A", how="left")
A B C_x C_y D
0 1 10 100 NaN NaN
1 2 20 200 20.0 200.0
2 3 30 300 30.0 400.0
pd.merge(df1, df2, on="A", how="right")
A B C_x C_y D
0 4 NaN NaN 10 100
1 2 20.0 200.0 20 200
2 3 30.0 300.0 30 400
pd.merge(df1, df2, on="A", how="outer")
A B C_x C_y D
0 1 10.0 100.0 NaN NaN
1 2 20.0 200.0 20.0 200.0
2 3 30.0 300.0 30.0 400.0
3 4 NaN NaN 10.0 100.0