Python Code Notes

Information by python engineer

pandas DataFrame型オブジェクトを結合する方法 Python

f:id:vigilantPotato:20190618225252p:plain

二つの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」が追加されました。