【pandas】データセットの連結
pandas.concat() は DataFrame や Series の連結に用いられる関数です。
最初に重複ラベルのない Series 同士を連結してみます。
# PANDAS_CONCAT_01
# In[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"))
# pandas.concat()でs1とs2を連結する
s3 = pd.concat([s1, s2])
print(s3)
a 1 b 2 c 3 d 4 dtype: int64
次は pandas.concat() を使って、重複ラベルのない DataFrame 同士を連結してみます。デフォルトでは行方向 (縦方向) に連結されます。
# In[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"))
# pandas.concat()で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 を渡します。
# In[3]
# concat()関数で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 を連結してみます。
# In[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" に設定すると積集合をとります (共通するラベルを抽出します)。
# In[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 同士の連結を試してみます。
# PANDAS_CONCAT_02
# In[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"))
# pandas.concat()でs4とs5を連結
s6 = pd.concat([s4, s5])
print(s6)
a 1 b 2 a 3 b 4 dtype: int64
このように、Series は重複ラベルを許容します。
重複ラベルにアクセスすると、対応するすべての要素が返ります。
# In[2]
# 重複ラベルにアクセス
print(s6["a"])
a 1 a 3 dtype: int64
しかし、データ分析の実践においては、重複ラベルはトラブルのもとなので、なるべく避けたほうがよいでしょう。ignore_index を True に設定すると、古いラベルを破棄して新しいラベルを割り当てます。
# In[3]
# pandas.concat()でs4とs5を連結して新しいラベルを作成
s7 = pd.concat([s4, s5], ignore_index = True)
print(s7)
0 1 1 2 2 3 3 4 dtype: int64
自分でラベルを設定したい場合は、index 属性にアクセスして書き換えます。
# In[4]
# インデクス変更
s6.index = ["a", "b", "c", "d"]
print(s6)
a 1 b 2 c 3 d 4 dtype: int64
コメントを書く