Pandas データ連結(concat / append)

データ連結は、複数の DataFrame または Series を行方向または列方向に連結することです。pd.concat主要な連結関数であり、append簡易版です(非推奨であり、concat の使用を推奨します)。


concat の基本用法

pd.concat()軸方向に沿って複数の DataFrame または Series を連結できます。

行方向の連結(上下の連結)

例

import pandas as pd

# 2つの DataFrame を作成する
df1 = pd.DataFrame({
    "名前": ["張三", "李四"],
    "年齢": [25, 30]
})

df2 = pd.DataFrame({
    "名前": ["王五", "趙六"],
    "年齢": [28, 35]
})

print("DataFrame 1:")
print(df1)
print()

print("DataFrame 2:")
print(df2)
print()

# 上下に連結する
result = pd.concat([df1, df2], ignore_index=True)
print("連結結果:")
print(result)

列方向の連結(左右の連結)

例

import pandas as pd

df1 = pd.DataFrame({
    "名前": ["張三", "李四", "王五"]
})

df2 = pd.DataFrame({
    "年齢": [25, 30, 28],
    "都市": ["北京", "上海", "広州"]
})

# 左右に連結する
result = pd.concat([df1, df2], axis=1)
print("左右の連結:")
print(result)

axis=0行方向の連結(行を追加)を表し、axis=1列方向の連結(列を追加)を表します。


重複インデックスの処理

ignore_index

例

import pandas as pd

df1 = pd.DataFrame({
    "名前": ["張三", "李四"],
    "年齢": [25, 30]
}, index=[0, 1])

df2 = pd.DataFrame({
    "名前": ["王五", "趙六"],
    "年齢": [28, 35]
}, index=[0, 1])

# デフォルトでは元のインデックスを保持する
print("元のインデックスを保持:")
print(pd.concat([df1, df2]))
print()

# 古いインデックスを無視して再生成する
print("元のインデックスを無視:")
print(pd.concat([df1, df2], ignore_index=True))

重複キーの検証

例

import pandas as pd

df1 = pd.DataFrame({
    "A": [1, 2]
})

df2 = pd.DataFrame({
    "A": [3, 4]
})

# 重複キーがあるか確認する
print("検証オブジェクト:")
print(pd.concat([df1, df2], verify_integrity=True))

列の不一致の処理

join パラメータ

例

import pandas as pd

df1 = pd.DataFrame({
    "A": [1, 2, 3],
    "B": ["a", "b", "c"]
})

df2 = pd.DataFrame({
    "B": ["x", "y", "z"],
    "C": [10, 20, 30]
})

print("df1:")
print(df1)
print()

print("df2:")
print(df2)
print()

# outer join(デフォルト):すべての列を保持する
print("outer 連結(すべての列を保持):")
print(pd.concat([df1, df2], join="outer"))
print()

# inner join:共通の列のみ保持する
print("inner 連結(共通の列を保持):")
print(pd.concat([df1, df2], join="inner"))

新しい列のみ追加

例

import pandas as pd

df1 = pd.DataFrame({
    "名前": ["張三", "李四"],
    "年齢": [25, 30]
})

df2 = pd.DataFrame({
    "都市": ["北京", "上海"]
})

# df2 の列を df1 に追加する
result = pd.concat([df1, df2], axis=1)
print("新しい列のみ追加:")
print(result)

keys パラメータで階層インデックスを作成

例

import pandas as pd

df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})
df3 = pd.DataFrame({"A": [9, 10], "B": [11, 12]})

# keys パラメータを使用して階層インデックスを作成する
result = pd.concat([df1, df2, df3], keys=["1年目", "2年目", "3年目"])
print("階層インデックス付きの連結:")
print(result)
print()

# 階層インデックスからデータを取得する
print("2年目のデータを取得:")
print(result.loc["2年目"])

実践:複数月のデータを結合

例

import pandas as pd

# 複数月の販売データをシミュレーションする
jan_sales = pd.DataFrame({
    "月": ["2024-01"] * 3,
    "製品": ["A", "B", "C"],
    "販売量": [100, 150, 80]
})

feb_sales = pd.DataFrame({
    "月": ["2024-02"] * 3,
    "製品": ["A", "B", "C"],
    "販売量": [120, 140, 90]
})

mar_sales = pd.DataFrame({
    "月": ["2024-03"] * 3,
    "製品": ["A", "B", "C"],
    "販売量": [110, 160, 85]
})

# 第1四半期のデータを結合する
quarterly = pd.concat([jan_sales, feb_sales, mar_sales], ignore_index=True)
print("第1四半期の集計:")
print(quarterly)
print()

# 月ごとに集計する
monthly_summary = quarterly.groupby("月")["販売量"].sum()
print("月別販売量の集計:")
print(monthly_summary)

append メソッド(非推奨)

DataFrame.append()Pandas 2.0 では非推奨となり、使用は推奨されません。ご使用くださいpd.concat()代わりに。

# 不推荐(已废弃)
result = df1.append(df2)

# 推荐
result = pd.concat([df1, df2])

concatPandas でデータ連結を行う標準メソッドであり、性能も良く、機能もより充実しています。

その他の拡張