pandasのDataFrameでカラム末尾に"_x"や"_y"が付いてしまう。
カラム名が変わってしまうと要素にアクセスする際に困るので、"_x"や"_y"を付けたくない。
今回はカラム末尾に"_x"や"_y"が付いてしまう原因と対策を紹介する。
カラム末尾に"_x"や"_y"が付いてしまう原因
pandasのDataFrameでカラム末尾に"_x"や"_y"が付いてしまう原因は、マージ時にカラム重複が発生したから。
以降、カラム重複の発生について説明していく。
まず2つのデータフレームを用意し、結合するために同じ値を持ったカラムを双方に持たせる。
今回は結合用のキーカラムを c3 とする。
import pandas as pd data_list1 = [ [1,2,3], [2,3,4], [3,4,5] ] col_list1 = ["c1","c2","c3"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) print(df1) # c1 c2 c3 # 0 1 2 3 # 1 2 3 4 # 2 3 4 5 data_list2 = [ [3,2,1,0], [4,3,2,1], [5,4,3,2] ] col_list2 = ["c3","c2","c1","c0"] df2 = pd.DataFrame(data=data_list2, columns=col_list2) print(df2) # c3 c2 c1 c0 # 0 3 2 1 0 # 1 4 3 2 1 # 2 5 4 3 2
このまま merge
によって2つのデータフレームをカラム c3
をキーとしてマージすると、結合キー以外は双方のデータフレームのカラムは別物扱いされる、
カラム名が被っている c1 と c2 はdf1とdf2の両方にあるので、区別するために"_x"や"_y"を自動的に付けられてしまう。
df_merge = pd.merge(df1, df2, on='c3', how="outer") print(df_merge) # c1_x c2_x c3 c2_y c1_y c0 # 0 1 2 3 2 1 0 # 1 2 3 4 3 2 1 # 2 3 4 5 4 3 2
カラム末尾に付く"_x"や"_y"については、pandasドキュメントの merge
の項目でも、「カラム名の重複時に付くもの」と說明されている。
suffixestuple of (str, str), default (‘_x’, ‘_y’)
Suffix to apply to overlapping column names in the left and right side, respectively. To raise an exception on overlapping columns use (False, False).
カラム末尾に"_x"や"_y"が付けない方法
カラム末尾に"_x"や"_y"が付けない方法は、カラム名の重複を無くすことだ。
マージするデータフレームの片方から予め重複カラムを drop
で削除しておくと、merge
の段階でカラム重複は無いのでカラム末尾に"_x"や"_y"が付かなくなる。
df2 = df2.drop(["c1","c2"],axis=1) df_merge = pd.merge(df1, df2, on='c3', how="outer") print(df_merge) # c1 c2 c3 c0 # 0 1 2 3 0 # 1 2 3 4 1 # 2 3 4 5 2