【Python】Pandas ~ データ連結 / 結合編 ~

■ はじめに

Pandas の データフレームの結合に関してメモっておく。

目次

【1】pd.concat()
 1)オプション
  a) index:連結方向の指定
 2)サンプル
 3)参考文献
【2】pd.merge()
 1)オプション
  a) how:結合方法を指定
  b) on, left_on, right_on : キーとする列を指定
 2)サンプル
 3)参考文献
【3】DataFrame.append

【1】pd.concat()

* データフレームを結合する

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html

1)オプション

a) index:連結方向の指定

* 連結方向を指定する
 + 縦方向(axis=0, デフォルト)
 + 横方向(axis=1)

https://note.nkmk.me/python-pandas-concat/

2)サンプル

import pandas as pd
import io

csv_header = ["no", "name", "remarks"]

csv_data1 = """
1,Mike,hello
2,Smith,World
3,Tom,!!!
"""
data_frame1 = pd.read_csv(
  io.StringIO(csv_data1),
  sep=',',
  header=None,
  names=csv_header)

csv_data2 = """
4,Kevin,Hi
5,Sam,World
6,Ken,!!
"""
data_frame2 = pd.read_csv(
  io.StringIO(csv_data2),
  sep=',',
  header=None,
  names=csv_header)

# ★注目★
data_frame = pd.concat([data_frame1, data_frame2], ignore_index=True)

for index, row in data_frame.iterrows():
  print('*[{}]****'.format(index))

  for item in csv_header:
    print("{} - {}".format(item, row[item]))

  print('*****')

出力結果

*[0]****
no - 1
name - Mike    
remarks - hello
*****
*[1]****       
no - 2
name - Smith   
remarks - World
*****
*[2]****       
no - 3
name - Tom
remarks - !!!
*****
*[3]****
no - 4
name - Kevin
remarks - Hi
*****
*[4]****
no - 5
name - Sam
remarks - World
*****
*[5]****
no - 6
name - Ken
remarks - !!
*****

3)参考文献

https://deepage.net/features/pandas-concat.html

【2】pd.merge()

* SQLの内部結合/外部結合のように連結可能。

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html

1)オプション

a) how:結合方法を指定

* 結合の種類は以下の通り。

 + 内部結合(inner_join)- how='inner'
 + 左結合(left_join)- how='left'
 + 右結合(right_join)- how='right'
 + 外部結合(outer_join)- how='outer'

b) on, left_on, right_on : キーとする列を指定

* キーとする列を指定
 + on - 結合する列名を指定
 + left_on  - 左側の結合する列名を指定
 + right_on - 右側の結合する列名を指定

2)サンプル

import pandas as pd

df1 = pd.DataFrame({'X': ['x-1', 'x-2', 'x-3'], 'Y': ['y-1', 'y-2', 'y-3']})
df2 = pd.DataFrame({'X': ['x-1', 'x-2', 'x-4'], 'Z': ['z-1', 'z-2', 'z-4']})

print(pd.merge(df1, df2, how='inner', on='X'))
print("*****************")
print(pd.merge(df1, df2, how='left', on='X'))
print("*****************")
print(pd.merge(df1, df2, how='right', on='X'))
print("*****************")
print(pd.merge(df1, df2, how='outer', on='X'))

出力結果

     X    Y    Z
0  x-1  y-1  z-1
1  x-2  y-2  z-2
*****************
     X    Y    Z
0  x-1  y-1  z-1
1  x-2  y-2  z-2
2  x-3  y-3  NaN
*****************
     X    Y    Z
0  x-1  y-1  z-1
1  x-2  y-2  z-2
2  x-4  NaN  z-4
*****************
     X    Y    Z
0  x-1  y-1  z-1
1  x-2  y-2  z-2
2  x-3  y-3  NaN
3  x-4  NaN  z-4

3)参考文献

https://note.nkmk.me/python-pandas-merge-join/

【3】DataFrame.append

シンプルに連結するには、DataFrame.appendも使える

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html

df1.append(df2)

参考文献

https://sinhrks.hatenablog.com/entry/2015/01/28/073327
https://qiita.com/hikaru_/items/e9c1356f674f2baa9e64

関連記事

Pandas ~入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/22/014957
Pandas ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/10/14/000000
Pandas ~ 基本編 / データのクレンジング ~
https://dk521123.hatenablog.com/entry/2020/04/06/235555
Pandas ~ データ集計編 ~
https://dk521123.hatenablog.com/entry/2021/04/07/105858
Pandas ~ 基本編 / CSV編 ~
https://dk521123.hatenablog.com/entry/2020/11/17/000000
Python ~ 基本編 / CSV
https://dk521123.hatenablog.com/entry/2019/11/07/214108
NumPy ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/03/28/224532
Python 3 エンジニア認定データ分析試験
https://dk521123.hatenablog.com/entry/2020/12/12/000000