Pandas concat() 関数

Pandas 通用函数Pandas よく使われる関数


pd.concat()は Pandas ライブラリ内で、複数のシリーズ(Series)またはデータフレーム(DataFrame)を連結(結合)するための関数です。これは行方向または列方向に複数のオブジェクトを1つの新しいオブジェクトに結合できます。

これはデータ処理で最もよく使われる結合操作の1つで、縦方向にデータを追加する場合も、横方向にフィールドを結合する場合も、pd.concat()どちらも対応できます。

単語の意味: concat"concatenate"(連結、連接)の略で、複数のものを前後につなぎ合わせるという意味です。


基本構文とパラメータ

pd.concat()Pandasライブラリのトップレベル関数であり、指定した軸に沿って複数のSeriesまたはDataFrameオブジェクトを連結するために使用します。

構文形式

pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False)

パラメータの説明

  • パラメータ: objs
    • 型: Series、DataFrame、またはそれらのリスト。
    • 説明: 連結する1つ以上のSeries/DataFrameオブジェクト。単一のオブジェクト、リスト、または辞書を指定できます。
  • パラメータ: axis
    • 型: 整数(0 または 1)。
    • 説明: 連結する軸の方向を指定します。0は行方向の連結(縦方向の追加)を表し、1は列方向の連結(横方向の結合)を表します。デフォルトは0。
  • パラメータ: join
    • 型: 文字列('outer' または 'inner')。
    • 説明: 連結方向のインデックスが一致しない場合の処理方法。'outer'は和集合(すべてのインデックスを保持)を表し、'inner'は積集合(共通のインデックスのみを保持)を表します。デフォルトは'outer'。
  • パラメータ: ignore_index
    • 型: ブール値。
    • 説明: もしTrueの場合、連結後は元のインデックスを使用せず、新しい整数インデックスを作成します。デフォルトはFalse。
  • パラメータ: keys
    • 型: シーケンス。
    • 説明: 連結後に多層インデックスを作成し、各元オブジェクトの出所を識別するために使用します。デフォルトはNone。

関数の説明

  • 戻り値: 連結後のSeriesまたはDataFrameオブジェクトを返します。型は入力オブジェクトと一致します。
  • 効果: 指定した軸に沿って複数のオブジェクトを1つのオブジェクトに結合します。

例

簡単な例から複雑な例までの一連の例を通して、徹底的にpd.concat()の使い方をマスターしましょう。

サンプル 1:基本用法 - Series を縦方向に連結

例

import pandas as pd

# 1. 创建两个 Series
s1 = pd.Series(['Alice', 'Bob', 'Charlie'], name='name')
s2 = pd.Series(['Diana', 'Eve', 'Frank'], name='name')

print("=== 原始 Series ===")
print("s1:", s1.tolist())
print("s2:", s2.tolist())

# 2. 使用 pd.concat() 纵向拼接(默认 axis=0)
result = pd.concat([s1, s2])
print("\n"=== pd.concat([s1, s2]) 纵向拼接结果 ===")
print(result)

# 3. 元のインデックスを無視して、新しい整数インデックスを作成する
result_ignore = pd.concat([s1, s2], ignore_index=True)
print("\n"=== ignore_index=True 结果 ===")
print(result_ignore)

実行結果の予想:

=== 原始 Series ===
s1: ['Alice', 'Bob', 'Charlie']
s2: ['Diana', 'Eve', 'Frank']

=== pd.concat([s1, s2]) 纵向拼接结果 ===
0      Alice
1        Bob
2    Charlie
0     Diana
1        Eve
2     Frank
dtype: object

=== ignore_index=True 结果 ===
0      Alice
1        Bob
2    Charlie
3      Diana
4        Eve
5      Frank
dtype: object

コードの解説:

  1. pd.concat([s1, s2])2つのSeriesを縦方向に連結して、より長いSeriesにします。
  2. デフォルトでは元のインデックスが保持されるため、インデックス値 0, 1, 2 が重複します。
  3. 設定すると、ignore_index=True連続する数値インデックスを再生成できます。

サンプル 2:DataFrame を横方向に連結

使用すると、axis=1複数のDataFrameを列方向に連結でき、これは異なるフィールドを結合する必要がある場合に非常に便利です。

例

import pandas as pd

# 1. 创建两个 DataFrame
df1 = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35]
})

df2 = pd.DataFrame({
    'city': ['Beijing', 'Shanghai', 'Guangzhou'],
    'score': [85, 90, 95]
})

print("=== 原始 DataFrame ===")
print("df1:")
print(df1)
print("\ndf2:")
print(df2)

# 2. 横向拼接(axis=1)
result = pd.concat([df1, df2], axis=1)
print("\n"=== pd.concat([df1, df2], axis=1) 横向拼接 ===")
print(result)

実行結果の予想:

=== 原始 DataFrame ===
df1:
      name  age
0   Alice   25
1     Bob   30
2 Charlie   35

df2:
        city  score
0   Beijing     85
1  Shanghai     90
2  Guangzhou     95

=== pd.concat([df1, df2], axis=1) 横向拼接 ===
      name  age      city  score
0   Alice   25   Beijing     85
1     Bob   30  Shanghai     90
2 Charlie   35  Guangzhou     95

コードの解説:

  • 使用して、axis=12つのDataFrameを列方向に連結します。
  • 横方向の連結では、2つのDataFrameが同じ行数(インデックスが揃っていること)である必要があります。
  • 連結後のDataFrameには、両方のオブジェクトのすべての列が含まれます。

サンプル 3:keys パラメータを使用して階層化インデックスを作成

keysパラメータはデータの出所を識別するのに役立ち、異なるデータセットの内容を結合する際に非常に便利です。

例

import pandas as pd

# 1. 複数の Series を含む辞書を作成する
data = {
    'group_a': pd.Series([1, 2, 3, 4]),
    'group_b': pd.Series([5, 6, 7, 8]),
    'group_c': pd.Series([9, 10, 11, 12])
}

print("=== 使用 keys 参数拼接 ===")
# 2. 使用 keys 参数创建层次化索引
result = pd.concat(data, keys=['第一组', '第二组', '第三组'])
print(result)

# 3. 特定の階層のデータにアクセスする
print("\n"=== '第一グループ' のデータにアクセス ===")
print(result['第一组'])

実行結果の予想:

=== 使用 keys 参数拼接 ===
第一组  group_a    1
        group_b    2
        group_c    3
        group_a    4
第二组  group_a    5
        group_b    6
        group_c    7
        group_a    8
第二组  group_b    9
...

コードの解説:

  • keysパラメータは連結結果に多層インデックス(階層化インデックス)を作成し、最初の階層がデータの出所であるグループを識別します。
  • を使用して、result['第一组']特定のグループのデータにアクセスできます。

サンプル 4:異なる列を持つ DataFrame の処理(join パラメータ)

連結するDataFrameが異なる列を持つ場合には、joinパラメータを使用して処理方法を制御できます。

例

import pandas as pd

# 1. 異なる列を持つ DataFrame を作成する
df1 = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [25, 30]
})

df2 = pd.DataFrame({
    'name': ['Charlie', 'Diana'],
    'score': [85, 90]
})

print("=== 原始 DataFrame ===")
print("df1:")
print(df1)
print("\ndf2:")
print(df2)

# 2. 外连接(默认)- 保留所有列
print("\n"=== join='outer' (外连接) ===")
print(pd.concat([df1, df2], join='outer'))

# 3. 内连接 - 只保留共同列
print("\n"=== join='inner' (内连接) ===")
print(pd.concat([df1, df2], join='inner'))

実行結果の予想:

=== 原始 DataFrame ===
df1:
    name  age
0  Alice   25
1    Bob   30

df2:
      name  score
0  Charlie     85
1    Diana     90

=== join='outer' (外连接) ===
      name   age  score
0    Alice  25.0   NaN
1      Bob  30.0   NaN
0  Charlie  NaN  85.0
1   Diana  NaN  90.0

=== join='inner' (内连接) ===
      name
0    Alice
1      Bob
0  Charlie
1  Diana

コードの解説:

  • join='outer'(デフォルト)すべての列を保持し、存在しない列はNaN。
  • join='inner'は2つのDataFrameに共通する列のみを保持します(ここではname)。

ヒント: pd.concat()簡単な連結操作に適しています。より複雑な結合(列値に基づくマッチングなど)が必要な場合は、pd.merge()関数を参照してください。

Pandas 常用函数Pandas よく使われる関数

その他の拡張