<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「left_on」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/left_on/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Sun, 11 Jan 2026 08:36:40 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「left_on」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【pandas】DataFrameを結合する方法 ~ merge, join ~</title>
		<link>https://tech.nkhn37.net/pandas-dataframe-merge-join/</link>
					<comments>https://tech.nkhn37.net/pandas-dataframe-merge-join/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 12 Mar 2022 20:00:00 +0000</pubDate>
				<category><![CDATA[pandas]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[left_index]]></category>
		<category><![CDATA[left_on]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[on]]></category>
		<category><![CDATA[right_index]]></category>
		<category><![CDATA[right_on]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=3055</guid>

					<description><![CDATA[pandasのDataFrameを結合する方法について解説します。 DataFrameの結合 データ分析の際には、データベースやCSVファイル等、様々なデータソースからデータを取得して分析することがほとんどです。この時、 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">pandasの<span class="marker"><strong>DataFrameを結合する方法</strong></span>について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">DataFrameの結合</h2>



<p class="wp-block-paragraph">データ分析の際には、データベースやCSVファイル等、様々なデータソースからデータを取得して分析することがほとんどです。この時、各データで同じ意味を表すキー列をもとに結合して分析できるようにすることは、データに対する深い知見を得るために必要不可欠です。</p>



<p class="wp-block-paragraph">Pythonのデータ分析で使用されるpandasでは、DataFrameの結合方法として<span class="marker"><strong><code>merge</code></strong></span>関数や<span class="marker"><strong><code>join</code></strong></span>メソッドといった非常に便利な機能が提供されています。</p>



<p class="wp-block-paragraph">以降では、以下図に示したような製品一覧と関連する情報を結合する例で<code>merge</code>関数や<code>join</code>メソッドを用いたDataFrameの結合方法を紹介していきます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="715" src="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-17-1024x715.png" alt="DataFrameの結合用データ例 merge join" class="wp-image-3064" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-17-1024x715.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-17-300x209.png 300w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-17-768x536.png 768w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-17.png 1455w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">上記例では、各製品シリアル一覧と関連する品質情報実績、顧客情報、製品特徴のデータがあるものとします。製造メーカー等では生産管理システムのマスタや製造実績、品質管理システムの品質実績など、様々なシステムのデータをつなげて分析したいといったことがよくあります。実際の現場で使われているデータはもっと複雑なデータが多いと思いますが、上記のような簡単データで結合のイメージをつかんでもらえればと思います。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">同じ構造をもつデータを単純に連結する場合には、<code>concat</code>を使うことができます。concat については「<a href="https://tech.nkhn37.net/pandas-dataframe-concat/" target="_blank" rel="noreferrer noopener">SeriesやDataFrameを連結する方法 ~ concat ~</a>」を参考にしてください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">merge関数によるDataFrameの結合の基本</h2>



<p class="wp-block-paragraph">データを結合する場合には、データの関係性をよく考慮することが重要です。データの関係に応じて「1対1」「多対1」「多対多」という関係性があります。以降では、それぞれの関係性のデータを使いながら<span class="marker"><strong><code>merge</code></strong></span>関数を使用してデータを結合する方法を紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">1対1の結合 </h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="368" src="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-18-1024x368.png" alt="DataFrameの結合 merge (1対1)" class="wp-image-3065" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-18-1024x368.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-18-300x108.png 300w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-18-768x276.png 768w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-18.png 1143w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">上記図の例は「1対1」の関係があるデータです。「<code>serial_no</code>」をキー列として見てみると、各レコード（各行）は1対1に対応していることがわかります。ここでは、製品一覧と品質情報を<code>serial_no</code>をキーに<code>merge</code>関数で結合します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)

# 品質情報
quality_result = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'quality': [100, 200, 300, 400, 500]
     }
)

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'品質実績(quality_result):\n{quality_result}\n')

# 製品一覧と品質情報をマージ（1対1）
result_df = pd.merge(product_list, quality_result)

print(f'製品一覧と品質情報をマージ（1対1）:\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
製品一覧(product_list):
  serial_no customer_id product_code
0      A001       cid_1          p_a
1      B001       cid_1          p_b
2      C001       cid_2          p_c
3      C002       cid_2          p_c
4      D001       cid_3          p_d

品質実績(quality_result):
  serial_no  quality
0      A001      100
1      B001      200
2      C001      300
3      C002      400
4      D001      500

製品一覧と品質情報をマージ（1対1）:
  serial_no customer_id product_code  quality
0      A001       cid_1          p_a      100
1      B001       cid_1          p_b      200
2      C001       cid_2          p_c      300
3      C002       cid_2          p_c      400
4      D001       cid_3          p_d      500</pre>



<p class="wp-block-paragraph"><code>merge</code>関数の引数に結合するDataFrameを指定すると、結合されたDataFrameが返却されます。<code>merge</code>関数は、自動的に1つ以上の同じ名前の列名を探してキーにして結合をしてくれます。上記例では「<code>serial_no</code>」がキーとなります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">多対1の結合 </h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="315" src="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-16-1024x315.png" alt="DataFrameの結合 merge (多対1)" class="wp-image-3063" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-16-1024x315.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-16-300x92.png 300w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-16-768x236.png 768w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-16.png 1252w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">上記図の例は「多対1」の関係があるデータです。「<code>customer_id</code>」をキー列として見てみると、製品一覧の複数レコードに1つの顧客情報のレコードが対応しています。ここでは、製品一覧と顧客情報を<code>customer_id</code>をキーにして<code>merge</code>関数で結合します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)

# 顧客情報
customer_info = pd.DataFrame(
    {'customer_id': ['cid_1', 'cid_2', 'cid_3'],
     'customer_name': ['顧客１', '顧客２', '顧客３']
     }
)

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'顧客情報(customer_info):\n{customer_info}\n')

# 製品一覧と顧客情報をマージ（多対1）
result_df = pd.merge(product_list, customer_info)

print(f'製品一覧と顧客情報をマージ（多対1）:\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">製品一覧(product_list):
  serial_no customer_id product_code
0      A001       cid_1          p_a
1      B001       cid_1          p_b
2      C001       cid_2          p_c
3      C002       cid_2          p_c
4      D001       cid_3          p_d

顧客情報(customer_info):
  customer_id customer_name
0       cid_1           顧客１
1       cid_2           顧客２
2       cid_3           顧客３

製品一覧と顧客情報をマージ（多対1）:
  serial_no customer_id product_code customer_name
0      A001       cid_1          p_a           顧客１
1      B001       cid_1          p_b           顧客１
2      C001       cid_2          p_c           顧客２
3      C002       cid_2          p_c           顧客２
4      D001       cid_3          p_d           顧客３</pre>



<p class="wp-block-paragraph">上記結果を見てみると<code>customer_id</code>をキーにして製品一覧に顧客情報が結合されていることが分かります。製品一覧の方が多であるため、顧客情報は複製されて各行に結合されていることが分かるかと思います。</p>



<h3 class="wp-block-heading jinr-heading d--bold">多対多の結合</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="523" src="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-19-1024x523.png" alt="DataFrameの結合 merge (多対多)" class="wp-image-3068" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/03/image-19-1024x523.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-19-300x153.png 300w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-19-768x393.png 768w, https://tech.nkhn37.net/wp-content/uploads/2022/03/image-19.png 1174w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">上記図の例は「多対多」の関係があるデータです。「<code>product_code</code>」をキー列としてみてみると、製品一覧の複数レコードに、複数の製品特徴のレコードが対応しているということが分かります。ここでは、製品一覧と製品特徴を<code>product_code</code>をキーにして<code>merge</code>関数で結合します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)

# 製品特徴
product_feature = pd.DataFrame(
    {'product_code': ['p_a', 'p_a', 'p_b', 'p_b', 'p_c', 'p_c',
                      'p_d', 'p_d', 'p_d'],
     'feature': ['a-1', 'a-2', 'b-1', 'b-2', 'c-1', 'c-2',
                 'd-1', 'd-2', 'd-3']
     }
)

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'製品特徴(product_feature):\n{product_feature}\n')

# 製品一覧と製品特徴をマージ（多対多）
result_df = pd.merge(product_list, product_feature)

print(f'製品一覧と製品特徴をマージ（多対多）:\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
製品一覧(product_list):
  serial_no customer_id product_code
0      A001       cid_1          p_a
1      B001       cid_1          p_b
2      C001       cid_2          p_c
3      C002       cid_2          p_c
4      D001       cid_3          p_d

製品特徴(product_feature):
  product_code feature
0          p_a     a-1
1          p_a     a-2
2          p_b     b-1
3          p_b     b-2
4          p_c     c-1
5          p_c     c-2
6          p_d     d-1
7          p_d     d-2
8          p_d     d-3

製品一覧と製品特徴をマージ（多対多）:
   serial_no customer_id product_code feature
0       A001       cid_1          p_a     a-1
1       A001       cid_1          p_a     a-2
2       B001       cid_1          p_b     b-1
3       B001       cid_1          p_b     b-2
4       C001       cid_2          p_c     c-1
5       C001       cid_2          p_c     c-2
6       C002       cid_2          p_c     c-1
7       C002       cid_2          p_c     c-2
8       D001       cid_3          p_d     d-1
9       D001       cid_3          p_d     d-2
10      D001       cid_3          p_d     d-3</pre>



<p class="wp-block-paragraph">上記結果を見てみると、多対多の関係であるため、ある製品シリアルに関するレコードが複数行に増えていることが分かるかと思います。</p>



<p class="wp-block-paragraph">上記で見てきた通り、<code>merge</code>関数は自動的に1つ以上のキーを探して結合してくれます。データの関係性による結合の違いを見てもらうために自動でのキー結合をで結果を見てもらいましたが、実際のデータ分析の場面では、結合したいキーを明確に指定して結合することがほとんどです。以降では、<code>merge</code>関数で、キーを指定してDataFrameを結合する方法を紹介していきます。</p>



<h2 class="wp-block-heading jinr-heading d--bold">merge関数でキーを指定したDataFrameの結合</h2>



<p class="wp-block-paragraph">ここでは、<code>merge</code>関数でキー列を指定してDataFrameを結合する方法を説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">onでキーを指定して結合</h3>



<p class="wp-block-paragraph"><code>merge</code>関数でキー列を指定する場合は、以下の例のように<span class="marker"><strong><code>on</code></strong></span>を使用してキー列を指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)

# 品質情報
quality_result = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'quality': [100, 200, 300, 400, 500]
     }
)

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'品質実績(quality_result):\n{quality_result}\n')

# onでキーを指定してマージ
result_df = pd.merge(product_list, quality_result, on='serial_no')

print(f'onでキー(serial_no)を指定してマージ\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
製品一覧(product_list):
  serial_no customer_id product_code
0      A001       cid_1          p_a
1      B001       cid_1          p_b
2      C001       cid_2          p_c
3      C002       cid_2          p_c
4      D001       cid_3          p_d

品質実績(quality_result):
  serial_no  quality
0      A001      100
1      B001      200
2      C001      300
3      C002      400
4      D001      500

onでキー(serial_no)を指定してマージ
  serial_no customer_id product_code  quality
0      A001       cid_1          p_a      100
1      B001       cid_1          p_b      200
2      C001       cid_2          p_c      300
3      C002       cid_2          p_c      400
4      D001       cid_3          p_d      500</pre>



<p class="wp-block-paragraph">上記例では、明示的に<code>"serial_no"</code>をキーとして結合しています。</p>



<p class="wp-block-paragraph">この例では、それぞれのDataFrameが同一名の列を持っているため、簡単に結合できます。しかし、データ分析では同じ意味でも異なる列名であることがよくあります。この場合には、以降で説明する<code>left_on</code>や<code>right_on</code>を使用します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">left_onとright_onでそれぞれのDataFrameのキーを指定する</h3>



<p class="wp-block-paragraph">データを結合する際には、それぞれのDataFrameで意味は同じなのに異なる列名となっている場合がよくあります。このような場合には<span class="marker"><strong><code>left_on</code></strong></span>や<span class="marker"><strong><code>right_on</code></strong></span>を使ってそれぞれのDataFrameにおけるキー列を指定します。</p>



<p class="wp-block-paragraph">ここで左(left)と言っているのは、<code>merge</code>関数の第1引数に指定するDataFrameで、右(<code>right</code>)と言っているのはmerge関数の第2引数に指定するDataFrameです。以下の例で見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)

# 品質情報
quality_result = pd.DataFrame(
    {'serial': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'quality': [100, 200, 300, 400, 500]
     }
)

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'品質実績(quality_result):\n{quality_result}\n')

# 左右のDataFrameのキーをそれぞれ指定してマージ
result_df = pd.merge(product_list, quality_result,
                     left_on='serial_no', right_on='serial')

print(f'左右のDataFrameのキーをそれぞれ指定してマージ:\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
製品一覧(product_list):
  serial_no customer_id product_code
0      A001       cid_1          p_a
1      B001       cid_1          p_b
2      C001       cid_2          p_c
3      C002       cid_2          p_c
4      D001       cid_3          p_d

品質実績(quality_result):
  serial  quality
0   A001      100
1   B001      200
2   C001      300
3   C002      400
4   D001      500

左右のDataFrameのキーをそれぞれ指定してマージ:
  serial_no customer_id product_code serial  quality
0      A001       cid_1          p_a   A001      100
1      B001       cid_1          p_b   B001      200
2      C001       cid_2          p_c   C001      300
3      C002       cid_2          p_c   C002      400
4      D001       cid_3          p_d   D001      500</pre>



<p class="wp-block-paragraph">上記例では、製品一覧ではシリアルナンバーは「<code>serial_no</code>」であるのに対して、品質情報では「<code>serial</code>」となっており名前が異なっています。この場合は、<code>merge</code>関数をそのまま使用しても一致するキーがなく、自動ではうまく結合できません。</p>



<p class="wp-block-paragraph">このような場合には「<code>left_on="serial_no"</code>」「<code>right_on="serial"</code>」としてそれぞれ結合するキー名称を指定することで指定列をキーにして結合することができます。</p>



<p class="wp-block-paragraph">上記結果を見ても分かるように、キー列は一つにまとめられるわけではなく複数列出てくる点も覚えておきましょう。もし、キー列が複数出てこないようにしたい場合は、事前にDataFrameの列名を揃えておく必要があります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">left_indexとright_indexを指定してDataFrameのインデックスで結合</h3>



<p class="wp-block-paragraph">これまでの例では、DataFrameの列名を使用した<code>merge</code>関数の実行例を見てきました。pandasのDataFrameでは、インデックスを持っているためインデックスを用いての結合をすることも可能です。</p>



<p class="wp-block-paragraph">インデックスを使用して結合する場合には、以下の例のように「<span class="marker"><strong><code>left_index=True</code></strong></span>」「<span class="marker"><strong><code>right_index=True</code></strong></span>」を指定することで、インデックスを使用しての結合が可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)
# serial_no列をインデックスに設定
product_list = product_list.set_index('serial_no')

# 品質情報
quality_result = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'quality': [100, 200, 300, 400, 500]
     }
)
# serial_no列をインデックスに設定
quality_result = quality_result.set_index('serial_no')

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'品質実績(quality_result):\n{quality_result}\n')

# インデックスを使ってマージ
result_df = pd.merge(product_list, quality_result,
                     left_index=True, right_index=True)

print(f'インデックスを使ってマージ:\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
製品一覧(product_list):
          customer_id product_code
serial_no                         
A001            cid_1          p_a
B001            cid_1          p_b
C001            cid_2          p_c
C002            cid_2          p_c
D001            cid_3          p_d

品質実績(quality_result):
           quality
serial_no         
A001           100
B001           200
C001           300
C002           400
D001           500

インデックスを使ってマージ:
          customer_id product_code  quality
serial_no                                  
A001            cid_1          p_a      100
B001            cid_1          p_b      200
C001            cid_2          p_c      300
C002            cid_2          p_c      400
D001            cid_3          p_d      500</pre>



<p class="wp-block-paragraph">上記例では、これまでと異なり<code>set_index</code>を使って<code>"serial_no"</code>列をインデックスとして登録していることに注意してください。</p>



<p class="wp-block-paragraph">結果を見ると分かりますが「<code>left_index=True</code>」「<code>right_index=True</code>」を指定することで、インデックスを使った結合ができていることが分かるかと思います。</p>



<h3 class="wp-block-heading jinr-heading d--bold">joinメソッドを用いたインデックスでの結合</h3>



<p class="wp-block-paragraph"><code>merge</code>関数でインデックスを用いた結合の例を紹介しましたが、DataFrameでは、インデックスをキーとして結合を実行するための<span class="marker"><strong><code>join</code></strong></span>メソッドが用意されています。<code>join</code>メソッドを使用することで、以下のようにインデックスを用いた結合が可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)
# serial_no列をインデックスに設定
product_list = product_list.set_index('serial_no')

# 品質情報
quality_result = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'quality': [100, 200, 300, 400, 500]
     }
)
# serial_no列をインデックスに設定
quality_result = quality_result.set_index('serial_no')

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'品質実績(quality_result):\n{quality_result}\n')

# joinメソッドを使ってインデックスで結合
result_df = product_list.join(quality_result)

print(f'joinメソッドを使ってインデックスで結合:\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
製品一覧(product_list):
          customer_id product_code
serial_no                         
A001            cid_1          p_a
B001            cid_1          p_b
C001            cid_2          p_c
C002            cid_2          p_c
D001            cid_3          p_d

品質実績(quality_result):
           quality
serial_no         
A001           100
B001           200
C001           300
C002           400
D001           500

joinメソッドを使ってインデックスで結合:
          customer_id product_code  quality
serial_no                                  
A001            cid_1          p_a      100
B001            cid_1          p_b      200
C001            cid_2          p_c      300
C002            cid_2          p_c      400
D001            cid_3          p_d      500</pre>



<p class="wp-block-paragraph"><code>merge</code>は関数でしたが、<code>join</code>についてはDataFrameのメソッドです。そのため、<code>join</code>メソッドは、左側となるDataFrameでメソッドとして呼び出し、右側となるDataFrameを引数として指定します。結果としては、merge関数で「<code>left_index=True</code>」「<code>right_index=True</code>」とした場合と同じです。</p>



<h3 class="wp-block-heading jinr-heading d--bold">left_on, right_on, left_index, right_indexの混在での結合</h3>



<p class="wp-block-paragraph">上記では、列を指定する「<code>left_on</code>」「<code>right_on</code>」、インデックスでの結合を指定する「<code>left_index=True</code>」「<code>right_index=True</code>」の使い方を見てきました。もちろん、これらは同時に使用することができ、列とインデックスを混在させて結合することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# 製品一覧
product_list = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'customer_id': ['cid_1', 'cid_1', 'cid_2', 'cid_2', 'cid_3'],
     'product_code': ['p_a', 'p_b', 'p_c', 'p_c', 'p_d']
     }
)
# serial_no列をインデックスに設定
product_list = product_list.set_index('serial_no')

# 品質情報
quality_result = pd.DataFrame(
    {'serial_no': ['A001', 'B001', 'C001', 'C002', 'D001'],
     'quality': [100, 200, 300, 400, 500]
     }
)

print(f'製品一覧(product_list):\n{product_list}\n')
print(f'品質実績(quality_result):\n{quality_result}\n')

# インデックスを使ってマージ（左：インデックスを使用、右：列名を指定）
result_df = pd.merge(product_list, quality_result,
                     left_index=True, right_on='serial_no')

print(f'インデックスを使ってマージ（左：インデックス、右：列名）\n{result_df}')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
製品一覧(product_list):
          customer_id product_code
serial_no                         
A001            cid_1          p_a
B001            cid_1          p_b
C001            cid_2          p_c
C002            cid_2          p_c
D001            cid_3          p_d

品質実績(quality_result):
  serial_no  quality
0      A001      100
1      B001      200
2      C001      300
3      C002      400
4      D001      500

インデックスを使ってマージ（左：インデックス、右：列名）
  customer_id product_code serial_no  quality
0       cid_1          p_a      A001      100
1       cid_1          p_b      B001      200
2       cid_2          p_c      C001      300
3       cid_2          p_c      C002      400
4       cid_3          p_d      D001      500</pre>



<p class="wp-block-paragraph">上記例では、左側となる製品一覧は、DataFrameのインデックスを使用し、右側となる品質情報は、列名をキーとして結合しています。このようにインデックスや列名を混在させて、柔軟に結合することが可能です。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">pandasの<span class="marker"><strong>DataFrameを結合する方法</strong></span>について解説しました。</p>



<p class="wp-block-paragraph">pandasでは、DataFrameの結合方法として<span class="marker"><strong><code>merge</code></strong></span>関数や<span class="marker"><strong><code>join</code></strong></span>メソッドが用意されています。結合時には、1対1、多対1、多対多といったことを考慮して結合をすることが適切な結合のためには重要です。それぞれのパターンに関する結合を例を使って紹介しました。</p>



<p class="wp-block-paragraph">また、<code>merge</code>関数で結合する際のキーの指定は非常に重要です。列名を指定する<code>on</code>、<code>left_on</code>、<code>right_on</code>やインデックスで結合する<code>left_index=True</code>、<code>right_index=True</code>といった指定方法について説明しました。</p>



<p class="wp-block-paragraph">データ分析では、異なるデータソースのデータを適切に結合できることが、データから深い知見を得るために必要不可欠です。是非、<code>merge</code>関数や<code>join</code>メソッドを適切に使用できるようになってデータ分析に活かしてください。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>merge</code> 関数の公式ドキュメントは<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。<br><code>join</code> メソッドの公式ドキュメントは<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-data-analysis/pandas/dataframe-merge-join" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>

]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/pandas-dataframe-merge-join/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-12 14:35:18 by W3 Total Cache
-->