Pythonでpandas入門4(データの連結と結合)
Pythonのデータ分析で用いられるpandasの入門編です。データ(DataFrame)の連結や結合について解説します。
目次
データの連結
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になっています。
公開日
広告
Pythonでデータ分析カテゴリの投稿
- DataFrameの欠損値を特定の値で置き換える
- Pythonでpandas入門1(データの入力とデータへのアクセス)
- Pythonでpandas入門2(データの追加と削除および並び替え)
- Pythonでpandas入門3(データの統計量の計算)
- Pythonでpandas入門4(データの連結と結合)
- Pythonでpandas入門5(欠損値(NaN)の扱い)
- Pythonでデータを学習用と検証用に分割する
- Pythonでデータ分析入門1(初めての回帰分析)
- Pythonでデータ分析入門2(初めてのロジスティック回帰(2クラス分類))
- Pythonでデータ分析入門3(初めての決定木(多クラス分類))
- Pythonで回帰モデルの評価関数
- Pythonで箱ひげ図を描く
- Python(pandas)でExcelファイルを読み込んでDataFrameにする
- pandasでカテゴリ変数を数値データに変換する
- pandasでクロス集計する
- pandasで同じデータ(要素)がいくつあるか調べる
- pandasで相関係数を計算する
- pandasとseabornでデータの可視化(散布図行列)
- pandasの学習用のデータセットを入手する
- scikit-learnのサンプルデータセットを入手する