Python 同じインデックスを抽出して、列データを連結する「Pandasのmerge」

 本記事では、2つのデータフレームがあって、共通のindex(行番号,行名)の行データに対して、列データを連結する手順を載せました。もし、重複する列名がある場合はそれらを削除する操作も記載しています。

import pandas as pd

# データ1
df1 = pd.read_csv('data1.csv', index_col = 0)
df1

 データ1は、例えば下図のように506行×13列のデータである。

 

# データ2
df2 = pd.read_csv('data2.csv', index_col = 0)
df2

次に、データ2は下図のように300行列×14列のデータである。データ1との違いは、行が複数抜けている。また、列名「PRICE」が1列追加されている。

 

# 同じインデックスの行データを連結
DF = df1.merge(df2, left_index = True, right_index = True)
DF

下図は、データ1と2の同じindexを結合したデータである。重複する列名には語尾に_x, _yが追記されている。これら列名を元に戻す操作を次以降で行う。

 

# 列名に_yとある複数の列を削除する。
DF2 = DF[DF.columns[~DF.columns.str.contains('_y')]]
DF2

列名_yを一括で消す。

 

# 列名をリストで抽出
col_name_list = list(DF2.columns)
col_name_list

列名をリストで取得

 

# 列名_xの_xを取り除く
new_col_name_list = [] for col_name in col_name_list: if '_x' in col_name: new_col_name_list.append(col_name[:-2]) else: new_col_name_list.append(col_name) new_col_name_list

列名_x の_xを除去

 

# 列名をリストで代入
DF2.columns = new_col_name_list
DF2

 列名を代入すると下図のようになる。(ちなみに、これはデータ2と同じである。途中の処理をみてわかるように、実際のデータ処理におけるデータ1, 2は、互いに異なる列名が複数存在する状況、重複する列名が複数存在し得る状況を想定している。)

 

# 最後に、csvファイルへ出力する
DF2.to_csv('data3.csv', index = True)

以上

<広告>