Pythonでpandas入門4(データの連結と結合)

Pythonのデータ分析で用いられるpandasの入門編です。データ(DataFrame)の連結や結合について解説します。

目次

  1. データの連結
  2. データの結合

データの連結

concat()関数で、DataFrameを連結できます。

DataFrameを縦に連結する

元のDataFrameに別のDaraFrameを行としてつなげます。DataFrameを下にくっつけるイメージです。

import pandas as pd

df1 = pd.read_csv('test.csv', encoding='shift_jis')
df2 = pd.DataFrame([['MSX',0,0]], columns=['Name','World','Japan'])
df3 = pd.concat([df1, df2])
print(df1)
print(df2)
print(df3)

最初に2つのDataFrameの中身を表示して、最後に連結した結果を表示します。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

  Name  World  Japan
0  MSX      0      0

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34
0        MSX   0.00   0.00

インデックスは、元のDaraFrameのインデックスが維持されています。

DataFrameを横に連結する

concat()関数の引数にaxis=1を指定すると、DataFrameを横に連結します。列が増えるイメージです。

import pandas as pd

df1 = pd.read_csv('test.csv', encoding='shift_jis')
df2 = pd.DataFrame([['Windows','x64/arm'], ['OS X','x64'], ['Chrome OS','x64/arm'], ['Linux','x64/arm']], columns=['Name','platform'])
df3 = pd.concat([df1, df2], axis=1)
df4 = pd.concat([df1, df2['platform']], axis=1)
print(df1)
print(df2)
print(df3)
print(df4)

最初に2つのDataFrameの中身を表示して、その後2つのDataFrameを連結した結果を表示します。最後にDaraFrameの特定の列だけを連結した結果を表示します。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

        Name platform
0    Windows  x64/arm
1       OS X      x64
2  Chrome OS  x64/arm
3      Linux  x64/arm

        Name  World  Japan       Name platform
0    Windows  75.56  65.88    Windows  x64/arm
1       OS X  16.48  16.64       OS X      x64
2  Chrome OS   2.09   0.51  Chrome OS  x64/arm
3      Linux   1.97   1.34      Linux  x64/arm

        Name  World  Japan platform
0    Windows  75.56  65.88  x64/arm
1       OS X  16.48  16.64      x64
2  Chrome OS   2.09   0.51  x64/arm
3      Linux   1.97   1.34  x64/arm

この連結では単純にDataFrameをつなげているだけということに注意が必要です。2つのDataFrameの行の並び順が同じになっていないと、おかしなデータになってしまいます。

データの結合

リレーショナルデータベースのテーブルを結合するように、merge()関数でDataFrameを結合できます。

内部結合

内部結合(inner join)は、指定した列をキーにして、両方のDataFrameに存在するデータだけを抽出して結合します。

merge()関数のhow引数にinnerを指定します。(innerが既定値なので、how引数を指定しないと内部結合になります。)

import pandas as pd

df1 = pd.read_csv('test.csv', encoding='shift_jis')
df2 = pd.DataFrame([['Windows','x64/arm'], ['Chrome OS','x64/arm'], ['MSX','Z80A'], ['OS X','x64']], columns=['Name','platform'])
df3 = pd.merge(df1,df2,how='inner',on='Name')
print(df1)
print(df2)
print(df3)

最初に2つのDataFrameの中身を表示して、最後に内部結合した結果を表示します。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

        Name platform
0    Windows  x64/arm
1  Chrome OS  x64/arm
2        MSX     Z80A
3       OS X      x64

        Name  World  Japan platform
0    Windows  75.56  65.88  x64/arm
1       OS X  16.48  16.64      x64
2  Chrome OS   2.09   0.51  x64/arm

1つ目のDataFrameにしかないLinux行と、2つ目のDaraFrameにしかないMSX列が、結合後のDataFrameにはありません。

また、OS X列が1つ目のDataFrameでは2行目、2つ目のDataFrameでは4行目にありますが、結合後のDataFrameのplatform列のデータはx64になっています。

外部結合

外部結合(outer join)は、基準となるDataFrameにデータが存在するものを抽出して結合します。

1つ目のDataFrameを基準にする場合は左外部結合(left outer join)、2つ目のDataFrameを基準にする場合を右外部結合(right outer join)、両方のDataFrameを基準にする場合を完全外部結合(full outer join)と言います。

import pandas as pd

df1 = pd.read_csv('test.csv', encoding='shift_jis')
df2 = pd.DataFrame([['Windows','x64/arm'], ['Chrome OS','x64/arm'], ['MSX','Z80A'], ['OS X','x64']], columns=['Name','platform'])
df3 = pd.merge(df1,df2,how='left',on='Name')
df4 = pd.merge(df1,df2,how='right',on='Name')
df5 = pd.merge(df1,df2,how='outer',on='Name')
print(df1)
print(df2)
print(df3)
print(df4)
print(df5)

最初に2つのDataFrameの中身を表示して、次に左外部結合の結果を、その次に右外部結合の結果を、最後に完全外部結合の結果を表示します。

Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

        Name platform
0    Windows  x64/arm
1  Chrome OS  x64/arm
2        MSX     Z80A
3       OS X      x64

        Name  World  Japan platform
0    Windows  75.56  65.88  x64/arm
1       OS X  16.48  16.64      x64
2  Chrome OS   2.09   0.51  x64/arm
3      Linux   1.97   1.34      NaN

        Name  World  Japan platform
0    Windows  75.56  65.88  x64/arm
1  Chrome OS   2.09   0.51  x64/arm
2        MSX    NaN    NaN     Z80A
3       OS X  16.48  16.64      x64

        Name  World  Japan platform
0    Windows  75.56  65.88  x64/arm
1       OS X  16.48  16.64      x64
2  Chrome OS   2.09   0.51  x64/arm
3      Linux   1.97   1.34      NaN
4        MSX    NaN    NaN     Z80A

左外部結合の結果には、MSX列がありません。

右外部結合の結果には、Linux列がありません。

完全外部結合の結果には、全ての列があります。

データが存在しない要素はNaNになっています。

公開日

広告