Python

pandasのDataFrameでカラム末尾に"_x"や"_y"が付いてしまう

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

コチラもオススメ

KRSW

駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

役に立ったらシェアしてくれると励みになります。

にほんブログ村 IT技術ブログへ

-Python
-,

Translate »

Copyright© ITips , 2020 All Rights Reserved.