HOWTO · Pandas

Pandas Python で 2 つの DataFrame を連結する方法

Pandas の助けを借りて、インデックス用のさまざまなタイプの集合論理と、join 型および merge 型操作のためのリレーショナル代数機能を使って、Series または DataFrame をすばやく組み合わせることができます。

このページの内容

2 つの Pandas DataFrame オブジェクトを pd.concat([df1, df2]) で組み合わせます。デフォルトでは、これは行を積み重ね、元のインデックスラベルを保持します。列を横に並べるには axis=1 を使用します。この場合、Pandas はインデックスで行を揃えます。行を id のような共有列で一致させる必要がある場合は、その列をキーとして DataFrame.merge() を使用してください。

以下の例では、小さく明示的な入力を使用しているため、この操作を自分の列とインデックスに合わせて調整できます。各出力は、対応する例の結果を示しています。

Pandas Python で 2 つの DataFrame を連結する

Pandas の DataFrame は、さまざまな種類の値を保持できる列を持つラベル付きテーブルです。2 つのテーブルに同じ種類のレコードが含まれている場合、行方向の連結はそれらを組み合わせる直接的な方法です。フレームを希望する順序でリストとして pd.concat() に渡します:

import pandas as pd

df1 = pd.DataFrame({"id": [1, 2], "name": ["Ada", "Lin"]})
df2 = pd.DataFrame({"id": [3, 4], "name": ["Sam", "Mina"]})

combined = pd.concat([df1, df2])
print(combined)
   id  name
0   1   Ada
1   2   Lin
0   3   Sam
1   4  Mina

デフォルトは axis=0 です。そのため、df2 の行は df1 の行の後に続きます。元のインデックスラベルは保持されます。両方の入力がインデックス 0 から始まるため、組み合わされた結果にはインデックスラベルが重複します。新しい連番インデックスの方が便利な場合は、ignore_index=True を渡します: pd.concat([df1, df2], ignore_index=True)。これにより、値と行の順序はそのままに、結果のインデックスが変更されます。

concat() を使って DataFrame を行方向または列方向に連結する

引数 axis は連結の方向を選択します。axis=0 は行を追加し、デフォルトです。axis=1 は列を追加し、各入力をそのインデックスラベルで揃えます。たとえば、同じインデックスを持つ行は一緒に表示されます。一致するラベルがない行も、もう一方のフレームの列に欠損値が入った形で表されます。

import pandas as pd

names = pd.DataFrame({"name": ["Ada", "Lin"]}, index=[10, 20])
scores = pd.DataFrame({"score": [91, 84]}, index=[10, 20])

side_by_side = pd.concat([names, scores], axis=1)
print(side_by_side)
   name  score
10  Ada     91
20  Lin     84

必要とする結果の形状から軸を選択してください。レコードを積み重ねる場合は行を、フィールドを追加する場合は列を使います。concat() の引数 join は、もう一方の軸上のラベルをどのように揃えるかを表します。これは id のような列の値を比較するものではありません。そのためには、次のセクションのキーベースのマージを使用してください。

インデックスで DataFrame を揃える、または共有キーで結合する

横方向の連結は、データ列内の等しい値ではなく、インデックスラベルを一致させます。join="outer" はもう一方の軸に対するデフォルトの配置で、どちらかの入力に見つかるラベルを保持し、一致しないセルを欠損値で埋めます。join="inner" は、両方の入力に存在するラベルのみを保持します。内部配置は行を破棄する可能性があるため、結果を共有ラベルに限定する意図がある場合にのみ選択してください。

import pandas as pd

left = pd.DataFrame({"name": ["Ada", "Lin"]}, index=[1, 2])
right = pd.DataFrame({"score": [91, 84]}, index=[2, 3])

outer = pd.concat([left, right], axis=1, join="outer")
inner = pd.concat([left, right], axis=1, join="inner")
print("outer rows:", len(outer), "inner rows:", len(inner))
outer rows: 3 inner rows: 1

共有フィールドを使ってレコードを一致させるには、merge() を使用し、on でキーを指定します。この操作は、2 つのテーブルが異なる行インデックスを使用していても、等しいキー値を一致させます。以下の例では、両方の入力に存在する ID のみを保持します。異なるキーの集合が必要な場合は、how="left"、"right"、または "outer" を使用してください。

import pandas as pd

people = pd.DataFrame({"id": [1, 2], "name": ["Ada", "Lin"]})
results = pd.DataFrame({"id": [2, 3], "score": [84, 91]})

matched = people.merge(results, on="id", how="inner")
print(matched)
   id name  score
0   2  Lin     84

非推奨の append() を concat() に置き換える

古い例では、あるフレームの行を別のフレームに追加するために append() メソッドを使う場合があります。このタスクでは、操作を concat() で記述し、両方のフレームを順番に渡してください。これにより、行方向の組み合わせが明示的になり、メインの例と同じパターンに従います:

import pandas as pd

first = pd.DataFrame({"item": ["pen", "book"]})
second = pd.DataFrame({"item": ["lamp"]})

combined = pd.concat([first, second], ignore_index=True)
print(combined)
   item
0   pen
1  book
2  lamp

オプション ignore_index=True は、ソースのインデックスラベルが組み合わされたテーブルで意味を持たない場合に便利です。これらのラベルに保持すべき情報が含まれている場合は、これを省略してください。バージョン固有の実行証拠は利用できないため、このセクションでは、どの Pandas バージョンが append() を提供するかについては主張しません。