二つのDataFrame型を結合し、新たなDataFrame型オブジェクトを生成する方法についてまとめました。
目次
concat関数で結合する方法
concat関数の基本
concat関数に二つのDataFrame型オブジェクトを渡すことで、それらを結合することができます。
例:DataFrame型オブジェクトの結合
import pandas as pd d1 = [[1,2,3], [4,5,6], [7,8,9]] d2 = [[10,11,12], [13,14,15], [16,17,18]] df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df3 = pd.concat([df1,df2]) print(df3)
出力:
0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 0 10 11 12 1 13 14 15 2 16 17 18
二つのDataFrame型オブジェクトを結合することができました。
結合する方向を制御するには、axisオプションを使用します。
axis=1で横方向(列方向)に結合可能です。デフォルトではaxis=0(行方向)になっています。
例:axisオプションで横方向に結合
import pandas as pd d1 = [[1,2,3], [4,5,6], [7,8,9]] d2 = [[10,11,12], [13,14,15], [16,17,18]] df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df3 = pd.concat([df1,df2], axis=1) print(df3)
出力:
0 1 2 0 1 2 0 1 2 3 10 11 12 1 4 5 6 13 14 15 2 7 8 9 16 17 18
横方向に結合することができました。
インデックスのリセット
concat関数で結合すると、二つのDataFrameのインデックスがそのまま引き継がれてしまいます。
インデックスに0から始まる整数値を振りなおしたい場合は、reset_indexメソッドを使用します。
例:reset_indexメソッドによるインデックスの振りなおし
import pandas as pd d1 = [[1,2,3], [4,5,6], [7,8,9]] d2 = [[10,11,12], [13,14,15], [16,17,18]] df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df3 = pd.concat([df1,df2]) df3.reset_index()
出力:
index 0 1 2 0 0 1 2 3 1 1 4 5 6 2 2 7 8 9 3 0 10 11 12 4 1 13 14 15 5 2 16 17 18
インデックスが振りなおされ、元のインデックスは新たに生成されたindex列となりました。
もとのインデックスを残さなくてよい場合は、dropオプションをTrueに設定します。
例:元のインデックスは削除してインデックスを振りなおし
import pandas as pd d1 = [[1,2,3], [4,5,6], [7,8,9]] d2 = [[10,11,12], [13,14,15], [16,17,18]] df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df3 = pd.concat([df1,df2]) df3.reset_index(drop=True)
出力:
0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 3 10 11 12 4 13 14 15 5 16 17 1
元のインデックスは削除されました。
インデックスを振りなおしたDataFrameオブジェクトをもとのオブジェクト(この例ではdf3)に上書きするためには、inplaceオプションをTrueに設定します。
例:インデックスを振りなおして元のオブジェクトに上書き
import pandas as pd d1 = [[1,2,3], [4,5,6], [7,8,9]] d2 = [[10,11,12], [13,14,15], [16,17,18]] df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df3 = pd.concat([df1,df2]) df3.reset_index(inplace=True) print(df3)
出力:
index 0 1 2 0 0 1 2 3 1 1 4 5 6 2 2 7 8 9 3 0 10 11 12 4 1 13 14 15 5 2 16 17 18
df3にインデックスを振りなおしたオブジェクトが上書きされました。
joinメソッドで結合する方法
DataFrame型オブジェクトのjoinメソッドを用いて結合することもできます。
df.join(other)
の様な形で、dfにotherを結合することができます。
例:DataFrame型オブジェクトをjoinメソッドで結合
import pandas as pd d1 = {'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5'], 'B':['B0', 'B1', 'B2', 'B3', 'B4', 'B5']} d2 = {'C': ['C0', 'C1', 'C2', 'C3'], 'D':['D0', 'D1', 'D2', 'D3']} df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df1.join(df2)
出力:
A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 4 A4 B4 NaN NaN 5 A5 B5 NaN NaN
df1にdf2が追加されました。
df1のインデックスが引き継がれ、df2でdf1のインデックスがない箇所には自動的にNaNが挿入されます。
df2側のインデックスを引き継ぐには、howオプションをrightに設定します。デフォルトではleftです。
import pandas as pd d1 = {'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5'], 'B':['B0', 'B1', 'B2', 'B3', 'B4', 'B5']} d2 = {'C': ['C0', 'C1', 'C2', 'C3'], 'D':['D0', 'D1', 'D2', 'D3']} df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df1.join(df2, how="right")
出力:
A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3
df2のインデックスが引き継がれました。
結合するデータフレーム間に共通のカラムがある場合は、そのままjoinメソッドを使用するとエラーが発生してしまいます。
その場合は、lsuffixオプションとrsuffixオプションを用いて、カラム名を変更する必要があります。
以下の例では、二つのデータフレームに共通のカラム「A」が存在する場合を示します。
例:カラム名を変更して結合
import pandas as pd d1 = {'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5'], 'B':['B0', 'B1', 'B2', 'B3', 'B4', 'B5']} d2 = {'A': ['A6', 'A7', 'A8', 'A9'], 'D':['D0', 'D1', 'D2', 'D3']} df1 = pd.DataFrame(d1) df2 = pd.DataFrame(d2) df1.join(df2, lsuffix='_df1', rsuffix='_df2')
出力:
A_df1 B A_df2 D 0 A0 B0 A6 D0 1 A1 B1 A7 D1 2 A2 B2 A8 D2 3 A3 B3 A9 D3 4 A4 B4 NaN NaN 5 A5 B5 NaN NaN
df1側のカラム「A」にlsuffixオプションで指定した「df1」が追加され、同様にdf2側のカラム「A」にrsuffixオプションで指定した「df2」が追加されました。