Pandas concat() 関数
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)
# 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
コードの解説:
pd.concat([s1, s2])2つのSeriesを縦方向に連結して、より長いSeriesにします。- デフォルトでは元のインデックスが保持されるため、インデックス値 0, 1, 2 が重複します。
- 設定すると、
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)
# 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['第一组'])
# 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'))
# 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 よく使われる関数