English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Pandas 結合

Pandasの結合操作の例

Pandasは、SQLなどの関係データベースと非常に似た機能が豊富で高性能なメモリ内結合操作を持ちます。
Pandasは、DataFrameオブジェクト間のすべての標準データベース結合操作のエントリポイントとして単一の機能mergeを提供します。

 pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
 left_index=False, right_index=False, sort=True)

ここでは、以下のパラメータを使用しています:

left − 1つのDataFrameオブジェクトです。 right − 別のDataFrameオブジェクトです。 on − (名前の)列が上に追加されます。左右のDataFrameオブジェクトの両方で見つける必要があります。 left_on − 左側のDataFrameの列がキーとして使用されます。列名またはDataFrameの長さと同じ長さの配列ができます。 right_on − 右側のDataFrameの列がキーとして使用されます。列名またはDataFrameの長さと同じ長さの配列ができます。 left_index − Trueの場合、左側のDataFrameのインデックス(行タグ)を使用して結合キーとしています。DataFrameがMultiIndex(階層)を持っている場合、レベル数は右側のDataFrameの結合キーの数と一致する必要があります。 right_index − 同じ使用方法でleft_indexが正しいデータフレームです。 how − 「左」、「右」、「外」、「内」のうちの一つです。デフォルトでは内部です。各方法は以下に説明します。 sort − 排序結果データフレームに辞書順のキーを追加します。デフォルトではTrueですが、多くの場合、Falseに設定することで性能が大幅に向上します。

现在让我们创建两个不同的DataFrame并对其执行合并操作。

# import the pandas library
 import pandas as pd
 left = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'subject_id':['sub1','sub2','sub4','sub6','sub5']})
 right = pd.DataFrame(
    {'id':[1,2,3,4,5],
    'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'subject_id':['sub2','sub4','sub3','sub6','sub5})
 print(left
 print(right)

以下は実行結果です:

      Name  id   subject_id
0   Alex   1         sub1
1    Amy   2         sub2
2  Allen   3         sub4
3  Alice   4         sub6
4  Ayoung  5         sub5
    Name  id   subject_id
0  Billy   1         sub2
1  Brian   2         sub4
2  Bran    3         sub3
3  Bryce   4         sub6
4  Betty   5         sub5

一つのキーでデータフレームを合併

 import pandas as pd
 left = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'subject_id':['sub1','sub2','sub4','sub6','sub5']})
 right = pd.DataFrame({
 'id': [1,2,3,4,5],
    'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'subject_id':['sub2','sub4','sub3','sub6','sub5']})
 print(pd.merge(left, right, on='id'))

以下は実行結果です:

     Name  id  subject_id_x   Name_y   subject_id_y
0  Alex      1          sub1    Billy           sub2
1  Amy       2          sub2    Brian           sub4
2  Allen     3          sub4     Bran           sub3
3  Alice     4          sub6    Bryce           sub6
4  Ayoung    5          sub5    Betty           sub5

複数のキーでデータフレームを合併

 import pandas as pd
 left = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'subject_id':['sub1','sub2','sub4','sub6','sub5']})
 right = pd.DataFrame({
 'id': [1,2,3,4,5],
    'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'subject_id':['sub2','sub4','sub3','sub6','sub5']})
 print(pd.merge(left, right, on=['id', 'subject_id']))

以下は実行結果です:

      Name_x   id   subject_id   Name_y
0    Alice    4         sub6    Bryce
1   Ayoung    5         sub5    Betty

合併に使用する“how”パラメータ

合併のhowパラメータは、結果テーブルに含めるべきキーを決定する方法を指定します。左側または右側のテーブルに組み合わせキーが存在しない場合、結合テーブルの値はNAです。

以下に、選択方法とそのSQLの相当名についてのまとめを示します:

合併方法SQL相当説明
leftLEFT OUTER JOIN使用左側のオブジェクトのkey
rightRIGHT OUTER JOIN使用正しいオブジェクトのkey
outerFULL OUTER JOIN使用合併key
innerINNER JOIN使用keyの交差点

左結合

 import pandas as pd
 left = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'subject_id':['sub1','sub2','sub4','sub6','sub5']})
 right = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'subject_id':['sub2','sub4','sub3','sub6','sub5']})
 print(pd.merge(left, right, on='subject_id', how='left'))

以下は実行結果です:

      Name_x   id_x   subject_id   Name_y   id_y
0     Alex      1         sub1      NaN    NaN
1      Amy      2         sub2    Billy    1.0
2    Allen      3         sub4    Brian    2.0
3    Alice      4         sub6    Bryce    4.0
4   Ayoung      5         sub5    Betty    5.0

右結合

 import pandas as pd
 left = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'subject_id':['sub1','sub2','sub4','sub6','sub5']})
 right = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'subject_id':['sub2','sub4','sub3','sub6','sub5']})
 print(pd.merge(left, right, on='subject_id', how='right'))

以下は実行結果です:

      Name_x  id_x   subject_id   Name_y   id_y
0      Amy   2.0         sub2    Billy      1
1    Allen   3.0         sub4    Brian      2
2    Alice   4.0         sub6    Bryce      4
3   Ayoung   5.0         sub5    Betty      5
4      NaN   NaN         sub3     Bran      3

外結合

 import pandas as pd
 left = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'subject_id':['sub1','sub2','sub4','sub6','sub5']})
 right = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'subject_id':['sub2','sub4','sub3','sub6','sub5']})
 print(pd.merge(left, right, how='outer', on='subject_id'))

以下は実行結果です:

      Name_x  id_x   subject_id   Name_y   id_y
0     Alex   1.0         sub1      NaN    NaN
1      Amy   2.0         sub2    Billy    1.0
2    Allen   3.0         sub4    Brian    2.0
3    Alice   4.0         sub6    Bryce    4.0
4   Ayoung   5.0         sub5    Betty    5.0
5      NaN   NaN         sub3     Bran    3.0

内結合

結合はインデックス上で実行されます。結合操作はそのオブジェクトを呼び出すと受け入れます。したがって、a.join(b)はb.join(a)ではありません。

 import pandas as pd
 left = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
    'subject_id':['sub1','sub2','sub4','sub6','sub5']})
 right = pd.DataFrame({
    'id': [1,2,3,4,5],
    'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
    'subject_id':['sub2','sub4','sub3','sub6','sub5']})
 print(pd.merge(left, right, on='subject_id', how='inner'))

以下は実行結果です:

      Name_x   id_x   subject_id   Name_y   id_y
0      Amy      2         sub2    Billy      1
1    Allen      3         sub4    Brian      2
2    Alice      4         sub6    Bryce      4
3   Ayoung      5         sub5    Betty      5