データセットの結合① pandas.concat()

データセットの結合① pandas.concat()

pandas.concat()

 pandas.concat() はデータセットの連結に用いられる関数です。
 最初に重複ラベルのない Series同士を連結してみます。

# リストPD25-1

import numpy as np
import pandas as pd

# Seriesオブジェクトを作成
s1 = pd.Series([1, 2], index=list("ab"))
s2 = pd.Series([3, 4], index=list("cd"))

# s1とs2を連結
s3 = pd.concat([s1, s2])

print(s3)
a    1
b    2
c    3
d    4
dtype: int64

 次は重複ラベルのない DataFrame 同士を連結してみます。
 デフォルトでは行方向 (縦) に連結されます。

# リストPD25-2

# DataFrameを作成
d1 = pd.DataFrame([[1, 2],
                   [3, 4]],
                  index = [1, 2], columns = list("ab"))

d2 = pd.DataFrame([[5, 6],
                   [7, 8]],
                  index = [3, 4], columns = list("cd"))

# d1とd2を行方向に連結
d3 = pd.concat([d1, d2])

print(d3)
     a    b    c    d
1  1.0  2.0  NaN  NaN
2  3.0  4.0  NaN  NaN
3  NaN  NaN  5.0  6.0
4  NaN  NaN  7.0  8.0

 列方向 (横) につなぐ場合は axisキーワードに 1 を渡します。

# リストPD25-3

# d1とd2を列方向に連結
d4 = pd.concat([d1, d2], axis = 1)

print(d4)
     a    b    c    d
1  1.0  2.0  NaN  NaN
2  3.0  4.0  NaN  NaN
3  NaN  NaN  5.0  6.0
4  NaN  NaN  7.0  8.0

 次は列ラベルの一部が重複する DataFrame を連結してみます。

# リストPD25-4

# DataFrameを作成
d5 = pd.DataFrame([[1, 2, 3],
                   [4, 5, 6]],
                  index = [1, 2],
                  columns = list("ABC"))

d6 = pd.DataFrame([[10, 20, 30],
                   [40, 50, 60]],
                  index = [3, 4],
                  columns = list("BCD"))

# d5とd6の和集合
d7 = pd.concat([d5, d6], sort = True)

print(d7)
     A   B   C     D
1  1.0   2   3   NaN
2  4.0   5   6   NaN
3  NaN  10  20  30.0
4  NaN  40  50  60.0

 デフォルトでは和集合をとるように設定されています (join="outer")。すなわち、ラベルはすべて用いられ、該当する要素がない場合は欠損値として NaN が当てられます。
 join="inner" に設定すると積集合をとります (共通するラベルを抽出します)。

# リストPD25-5

# d5とd6の積集合
d8 = pd.concat([d5, d6], join = "inner", sort = True)

print(d8)
    B   C
1   2   3
2   5   6
3  10  20
4  40  50

 

 次はラベルが完全一致する Series同士の連結を試してみます。

# リストPD26-1

import numpy as np
import pandas as pd

# Seriesオブジェクトを作成
s4 = pd.Series([1, 2], index=list("ab"))
s5 = pd.Series([3, 4], index=list("ab"))

# s4とs5を連結
s6 = pd.concat([s4, s5])

print(s6)
a    1
b    2
a    3
b    4
dtype: int64

 このように、Series は重複ラベルを許容します。
 重複ラベルにアクセスすると、対応するすべての要素が返ります。

# リストPD26-2

# 重複ラベルにアクセス
print(s6["a"])
a    1
a    3
dtype: int64

 しかし、データ分析の実践においては、重複ラベルはトラブルのもとなので、なるべく避けたほうがよいでしょう。ignore_index を True に設定すると、古いラベルを破棄して新しいラベルを割り当てます。

# リストPD26-3

# s4とs5を連結して新しいラベルを作成
s7 = pd.concat([s4, s5], ignore_index = True)

print(s7)
0    1
1    2
2    3
3    4
dtype: int64

 自分でラベルを設定したい場合は、index属性にアクセスして書き換えます。

# リストPD26-4

# インデクス変更
s6.index = ["a", "b", "c", "d"]

print(s6)
a    1
b    2
c    3
d    4
dtype: int64