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)
# 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)
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))
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))
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"))
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)
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年目"])
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)
# 複数月の販売データをシミュレーションする
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 でデータ連結を行う標準メソッドであり、性能も良く、機能もより充実しています。