pandas

【Pandas】DataFrame間で重複する列名を取得する【Python】

MAX

DataFrameをconcatで横に結合する場合、列名が重複していても自動でサフィックスが付加されることはない。

そのため、concat後に重複している列名をなんとか対応するか、concat前に予め対応するかが必要となる。

スポンサーリンク

データ準備

1df1 = pd.DataFrame(data={
2    "A": [1, 2, 3],
3    "B": [4, 5, 6],
4    "C": [7, 8, 9]
5})
6print(df1)
7#    A  B  C
8# 0  1  4  7
9# 1  2  5  8
10# 2  3  6  9
11
12df2 = pd.DataFrame(data={
13    "A": [4, 5, 6],
14    "B": [5, 6, 7],
15    "C": [6, 7, 8]
16})
17print(df2)
18#    A  B  C
19# 0  4  5  6
20# 1  5  6  7
21# 2  6  7  8
22
23df3 = pd.DataFrame(data={
24    "B": [1, 4, 7],
25    "C": [2, 5, 8],
26    "D": [3, 6, 9]
27})
28print(df3)
29#    B  C  D
30# 0  1  2  3
31# 1  4  5  6
32# 2  7  8  9

df1とdf2は列名が完全に一致。df1とdf3はBとCが一致。

2つのDataFrameの列名が完全に一致するか確認する

set()を使い、各DataFrameの列が集合として一致するかを判定する。

1print(set(df1.columns) == set(df2.columns))
2# True
3print(set(df1.columns) == set(df3.columns))
4# False

この処理の前提として各DataFrame内で列名は一意になっている必要がある。

DataFrame内での重複している列名の確認や重複している列の削除方法は以下の記事を参照。

あわせて読みたい
【Pandas】DataFrame内で重複する列名を削除する【Python】
【Pandas】DataFrame内で重複する列名を削除する【Python】
1if set(df1.columns) == set(df2.columns):
2    # 2つのDataFrameの列名が一致する場合の処理
3    df_concat = pd.concat([df1, df2], axis=0)
4else:
5    # 2つのDataFrameの列名が一致しない場合の処理
6    raise ValueError("DataFrame columns not match.")
7

こんな感じでconcat前に列名が完全一致しているかチェックしたりするのに使える。

2つのDataFrameで一致している列名を取得する

2つのDataFrameの列名の集合の積集合を取る。

1# 集合を使い、共通する列名を取得する
2common_columns = set(df1.columns) & set(df3.columns)
3# 集合なので、順序は保証されない。
4print(common_columns)
5# {"C", "B"}

結果も集合なので、要素の順序は元データの列の順序と一致するとは限らないことに注意。

2つのDataFrameで一致していない列名を取得する

2つのDataFrameの列名の集合の差集合を取る。

2つのDataFrameを入れ替えると差集合の内容は一致するとは限らないため注意が必要。

1# df1に存在する列の中で、df3に存在しない列を取得
2different_columns_df1_df3 = set(df1.columns) - set(df3.columns)
3print(different_columns_df1_df3)
4# {"A"}
5
6# df3に存在する列の中で、df1に存在しない列を取得
7different_columns_df3_df1 = set(df3.columns) - set(df1.columns)
8print(different_columns_df3_df1)
9# {"D"}

「-」の右側と左側で差集合の内容が変わってくることに注意。

まとめ

2個のDataFrameの列名について

  • 完全一致するか確認したい場合は、集合が一致するかを確認する。
  • 共通の列名を確認したい場合は、積集合を取る。
  • 片方にしか存在しない列名を確認したい場合は、差集合を取る
    • 「-」の右側と左側を入れ替えると結果が異なる可能性があることに注意。
1# 2つのDataFrameの列名が一致するか確認
2print(set(df1.columns) == set(df2.columns))
3# True
4print(set(df1.columns) == set(df3.columns))
5# False
6
7# 2個のDataFrameの列名のうち、一致している列名を取得
8common_columns = set(df1.columns) & set(df3.columns)
9# 集合なので、順序は保証されない。
10print(common_columns)
11# {"C", "B"}
12
13# 2個のDataFrameの列名で一致していない列名を取得
14# df1に存在する列の中で、df3に存在しない列を取得
15different_columns_df1_df3 = set(df1.columns) - set(df3.columns)
16print(different_columns_df1_df3)
17# {"A"}
18
19# df3に存在する列の中で、df1に存在しない列を取得
20different_columns_df3_df1 = set(df3.columns) - set(df1.columns)
21print(different_columns_df3_df1)
22# {"D"}

スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました