データの結合
Contents
データの結合#
本節では 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_index
に True
を渡すと、インデックスを振り直します。
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 |
DafaFrame
に Series
を縦に結合するには 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 |
DafaFrame
に Series
を横に結合するには concat
関数の引数 axis
に 1
を渡して実行します。
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_index
に True
を渡すと、インデックスを振り直します。
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
を横に結合する場合は、引数 axis
に 1
を渡します。
この場合、 インデックスがキー になります 。
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 |