<?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>Pandas集計・結合入門｜groupby, concat, mergeの基本と実践 | Python Data Lab（Pythonデータラボ）</title>
	<atom:link href="https://pythondatalab.com/category/pandas/aggregation/feed/" rel="self" type="application/rss+xml" />
	<link>https://pythondatalab.com</link>
	<description>Python初心者向けに、わかりやすいデータ分析の解説を提供します。</description>
	<lastBuildDate>Wed, 02 Sep 2026 15:09:46 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://pythondatalab.com/wp-content/uploads/2025/12/cropped-rogo-32x32.png</url>
	<title>Pandas集計・結合入門｜groupby, concat, mergeの基本と実践 | Python Data Lab（Pythonデータラボ）</title>
	<link>https://pythondatalab.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>pandas shift()の使い方｜前の行・次の行の値を取得して比較する方法</title>
		<link>https://pythondatalab.com/pandas-shift/</link>
					<comments>https://pythondatalab.com/pandas-shift/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 29 Aug 2026 05:51:24 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2151</guid>

					<description><![CDATA[<p>pandasのshift()で前の行・2行前・次の行の値を取得する方法を初心者向けに解説。periodsの正負、NaNが出る理由、日付順の注意点、diff()・pct_change()との違いも具体例で学べます。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-shift/">pandas shift()の使い方｜前の行・次の行の値を取得して比較する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
  .colab-article pre[class*="language-"],
  .colab-article pre.line-numbers {
    margin: 0 !important;
    padding: 1em;
  }
  .colab-article .table-scroll {
    overflow-x: auto;
    margin: 1em 0;
  }
  .colab-article table.wp-block-table {
    width: auto;
    border-collapse: collapse;
  }
  .colab-article table.wp-block-table th,
  .colab-article table.wp-block-table td {
    border: 1px solid #d0d0d0;
  }
</style>
<div class="colab-article">


<p>「今日の売上を、前日の売上と比べたい」「前の行の値を別の列に入れたい」と思っても、行をずらす方向や、先頭に<code>NaN</code>が出る理由が分かりにくいことがあります。</p>


<p><strong>前の行の値を取得する基本形は<code>df['売上'].shift(1)</code>です。</strong> <code>shift(1)</code>で1行前、<code>shift(2)</code>で2行前、<code>shift(-1)</code>で次の行の値を取得できます。</p>


<p>ただし、<code>shift()</code>が参照するのは「前日」ではなく、<strong>現在の並び順における前の行</strong>です。日付データでは、先に日付型へ変換して昇順に並べることが重要です。</p>


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：目的に応じて4つの機能を使い分ける</a></li><li><a href="#toc3" tabindex="0">日別売上のサンプルデータを準備する</a></li><li><a href="#toc4" tabindex="0">shift(1)で1行前の値を取得する</a></li><li><a href="#toc5" tabindex="0">periodsで2行前・次の行の値を取得する</a></li><li><a href="#toc6" tabindex="0">前日売上と比較して差額・増減率を計算する</a></li><li><a href="#toc7" tabindex="0">shift()・diff()・pct_change()の結果を同じデータで比較する</a></li><li><a href="#toc8" tabindex="0">コードは動くが結果を誤解しやすい例：日付が並んでいない</a><ol><li><a href="#toc9" tabindex="0">症状・原因・確認方法・修正方法</a></li></ol></li><li><a href="#toc10" tabindex="0">NaNは無条件に0で埋めない</a><ol><li><a href="#toc11" tabindex="0">fill_valueを使う場合も値の意味を確認する</a></li></ol></li><li><a href="#toc12" tabindex="0">「値をずらす」と「日付をずらす」は同じではない</a></li><li><a href="#toc13" tabindex="0">データ分析の流れでshift()を使う位置</a></li><li><a href="#toc14" tabindex="0">まとめ</a></li><li><a href="#toc15" tabindex="0">関連記事</a><ol><li><a href="#toc16" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc17" tabindex="0">shift(1)とshift(-1)の違いは何ですか？</a></li><li><a href="#toc18" tabindex="0">先頭にNaNが出るのはなぜですか？</a></li><li><a href="#toc19" tabindex="0">shift()とdiff()の違いは何ですか？</a></li><li><a href="#toc20" tabindex="0">shift()は必ず前日の値を取得しますか？</a></li><li><a href="#toc21" tabindex="0">shift()で生じたNaNを0で埋めてもよいですか？</a></li><li><a href="#toc22" tabindex="0">Series.shift()とDataFrame.shift()の違いは何ですか？</a></li><li><a href="#toc23" tabindex="0">日付インデックスを1日ずらす処理と同じですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>


<ul>
<li><code>shift()</code>で1行前・2行前・次の行の値を取得する方法</li>
<li><code>periods</code>の正負と、値が移動する方向</li>
<li>元の売上と前日売上を比較し、差額や増減率を計算する方法</li>
<li>先頭や末尾に<code>NaN</code>が出る理由</li>
<li><code>shift()</code>・<code>diff()</code>・<code>pct_change()</code>・<code>rolling()</code>の使い分け</li>
<li>コードは動いても結果を誤解しやすい「並び順」の注意点</li>
</ul>


<p><code>shift()</code>は、DataFrameの確認・日付変換・並び替えを終えた後に、時系列データの比較元を作る処理です。差額や増減率を求める前の基礎として位置づけられます。</p>

<h2><span id="toc2">先に結論：目的に応じて4つの機能を使い分ける</span></h2>


<p>比較元となる値を列に残して確認したい場合は<code>shift()</code>を選びます。求めたい結果が最初から決まっている場合は、専用のメソッドを使うと簡潔です。</p>


<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">機能名</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">何を求めるか</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">注意点</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>shift()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">前後の行の値</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">比較元の値を列に残したい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">行の並び順が基準になる</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>diff()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行との差額</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">増減した量だけを求めたい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">最初の比較不能行は<code>NaN</code>になる</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>pct_change()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行からの増減率</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">前日比・前月比を求めたい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>0.1</code>は10%を表す</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>rolling()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">一定範囲の集計値</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">移動平均などで変動をならしたい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>window</code>分の行をまとめて計算する</td>
</tr>
</tbody>
</table>

</div>
<p>この記事では、比較元を作る<code>shift()</code>に焦点を絞ります。差額・増減率・移動平均の詳しい使い方は、それぞれの関連記事で確認できます。</p>

<h2><span id="toc3">日別売上のサンプルデータを準備する</span></h2>


<p>日付と売上を持つDataFrameを作ります。自分のデータへ置き換えるときも、最初に日付の型と並び順を確認してください。</p>

<pre class="line-numbers"><code class="language-python">import pandas as pd

df = pd.DataFrame({
    "日付": ["2026-08-01", "2026-08-02", "2026-08-03", "2026-08-04", "2026-08-05"],
    "売上": [100, 120, 90, 135, 150]
})

df["日付"] = pd.to_datetime(df["日付"])
df = df.sort_values("日付").reset_index(drop=True)
df</code></pre>
<p><strong>実行結果</strong></p>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
    </tr>
  </tbody>
</table>
</div>
<p>日付は2026年8月1日から5日までの昇順です。8月2日の1行前は8月1日なので、このサンプルでは「前の行の売上」を「前日売上」として扱えます。</p>


<p><strong>ただし、日付が連続していないデータでは、取得できるのは前日ではなく「前の観測日の値」です。</strong> 自分のデータでは、並び順だけでなく日付の欠けも確認してください。</p>


<p>日付変換は<a href="https://pythondatalab.com/pandas-to-datetime/">「pandas to_datetime()の使い方」</a>、並び替えは<a href="https://pythondatalab.com/pandas-sort/">「pandas 並び替え（sort）入門」</a>で詳しく解説しています。</p>

<h2><span id="toc4">shift(1)で1行前の値を取得する</span></h2>


<p><code>Series.shift(1)</code>を使い、売上列の1行前の値を「前日売上」列へ追加します。<code>shift()</code>の<code>periods</code>は省略すると<code>1</code>なので、<code>shift()</code>と<code>shift(1)</code>は同じ結果です。</p>

<pre class="line-numbers"><code class="language-python">df["前日売上"] = df["売上"].shift(1)
df</code></pre>
<p>処理前後を比べると、売上の値が1行下へずれています。</p>


<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上（処理前）</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日売上（<code>shift(1)</code>）</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
</tr>
</tbody>
</table>

</div>
<p>注目するのは8月2日以降の「前日売上」列です。8月2日には8月1日の<code>100</code>、8月3日には8月2日の<code>120</code>が入ります。</p>


<p>8月1日の前にはデータがないため、比較元が存在せず<code>NaN</code>になります。元のDataFrameから行が削除されたわけではなく、<code>shift()</code>がずらした結果を新しい列として返しています。</p>

<h2><span id="toc5">periodsで2行前・次の行の値を取得する</span></h2>


<p><code>periods</code>には、ずらす行数を指定します。正の値では過去側の行、負の値では未来側の行を各行から参照できます。</p>


<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">指定</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">各行に入る値</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">値の見かけ上の移動</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">比較元がない場所</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>shift(1)</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1行前の値</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1行下へ移動</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">先頭1行</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>shift(2)</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2行前の値</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2行下へ移動</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">先頭2行</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>shift(-1)</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">次の行の値</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1行上へ移動</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">末尾1行</td>
</tr>
</tbody>
</table>

</div>
<p>「正なら上、負なら下」と暗記するより、<strong>現在の行から見て、どの行の値が入るか</strong>で考えると混乱しにくくなります。</p>

<pre class="line-numbers"><code class="language-python">df["2日前売上"] = df["売上"].shift(2)
df["翌日売上"] = df["売上"].shift(-1)

df[["日付", "売上", "前日売上", "2日前売上", "翌日売上"]]</code></pre>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">2日前売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">翌日売上</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
</tr>
</tbody>
</table>

</div>
<p>8月3日の行を見ると、2日前の売上は8月1日の<code>100</code>、翌日の売上は8月4日の<code>135</code>です。<code>shift(-1)</code>では末尾より後の行が存在しないため、最後の「翌日売上」が<code>NaN</code>になります。</p>


<p><code>shift(1)</code>は1行前、<code>shift(-1)</code>は次の行です。時系列分析では、過去の値を表す列を<strong>ラグ（lag）</strong>、次の値を表す考え方を**リード（lead）**と呼ぶことがあります。</p>

<h2><span id="toc6">前日売上と比較して差額・増減率を計算する</span></h2>


<p>比較元の「前日売上」列を残しておくと、計算過程を確認しながら差額や増減率を求められます。</p>


<ul>
<li>差額：<code>当日売上 - 前日売上</code></li>
<li>増減率：<code>(当日売上 - 前日売上) / 前日売上</code></li>
</ul>

<pre class="line-numbers"><code class="language-python">df["前日差"] = df["売上"] - df["前日売上"]
df["前日比"] = (df["売上"] - df["前日売上"]) / df["前日売上"]

df[["日付", "売上", "前日売上", "前日差", "前日比"]]</code></pre>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日差</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日比</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">20</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.20</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">-30</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.25</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">45</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.50</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">15</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">約0.1111</td>
</tr>
</tbody>
</table>

</div>
<p>8月3日は売上<code>90</code>、前日売上<code>120</code>なので、前日差は<code>-30</code>、前日比は<code>-0.25</code>です。つまり、前日より30減り、25%減少したと読めます。</p>


<p>前日比の<code>0.20</code>は0.20%ではなく**20%**です。表示をパーセントに変える場合も、元の値の意味は変わりません。</p>

<pre class="line-numbers"><code class="language-python">result = df[["日付", "売上", "前日売上", "前日差", "前日比"]].copy()
result["前日比（表示用）"] = result["前日比"].map(
    lambda x: f"{x:.1%}" if pd.notna(x) else "—"
)
result</code></pre>
<p><strong>実行結果</strong></p>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日差</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日比</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日比（表示用）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">—</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.200000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20.0%</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">-30.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.250000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">-25.0%</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">90.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">45.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.500000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">50.0%</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">135.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">15.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.111111</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">11.1%</td>
    </tr>
  </tbody>
</table>
</div>
<p>表示用の列では、<code>0.20</code>が<code>20.0%</code>、<code>-0.25</code>が<code>-25.0%</code>になります。計算に使う列は数値のまま残し、文字列へ変えた表示用の列とは分けておくと安全です。</p>


<p>差額だけが必要なら<a href="https://pythondatalab.com/pandas-diff/">「pandas diff()の使い方」</a>、増減率だけが必要なら<a href="https://pythondatalab.com/pandas-pct-change/">「pandas pct_change()の使い方」</a>を使うと、同じ計算をより簡潔に書けます。<code>shift()</code>を使う利点は、比較元の値を見ながら結果を検算できることです。</p>

<h2><span id="toc7">shift()・diff()・pct_change()の結果を同じデータで比較する</span></h2>


<p>条件をそろえて、3つの方法の役割を確認します。<code>shift()</code>は前の値、<code>diff()</code>は差額、<code>pct_change()</code>は増減率を返します。</p>

<pre class="line-numbers"><code class="language-python">comparison = df[["日付", "売上"]].copy()
comparison["shift_前の値"] = comparison["売上"].shift(1)
comparison["diff_差額"] = comparison["売上"].diff()
comparison["pct_change_増減率"] = comparison["売上"].pct_change(fill_method=None)
comparison</code></pre>
<p><strong>実行結果</strong></p>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">shift_前の値</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">diff_差額</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">pct_change_増減率</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.200000</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">-30.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.250000</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">135</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">90.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">45.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.500000</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">135.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">15.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.111111</td>
    </tr>
  </tbody>
</table>
</div>
<p>8月4日の行では、<code>shift()</code>が比較元の<code>90</code>、<code>diff()</code>が差額の<code>45</code>、<code>pct_change()</code>が増減率の<code>0.50</code>を返します。どれが優れているという関係ではなく、<strong>何を結果として残したいか</strong>で選びます。</p>


<p>複数日の値をまとめて移動平均を求めたい場合は、前後の1行を参照する<code>shift()</code>ではなく<a href="https://pythondatalab.com/pandas-rolling/">「pandas rolling()の使い方」</a>が適しています。</p>

<h2><span id="toc8">コードは動くが結果を誤解しやすい例：日付が並んでいない</span></h2>


<p><code>shift()</code>は、日付の大小ではなく現在の行順を基準にします。次のDataFrameは日付が不規則ですが、コード自体はエラーになりません。</p>

<pre class="line-numbers"><code class="language-python">df_unsorted = pd.DataFrame({
    "日付": pd.to_datetime(["2026-08-03", "2026-08-01", "2026-08-02"]),
    "売上": [90, 100, 120]
})

df_unsorted["前の行の売上"] = df_unsorted["売上"].shift(1)
df_unsorted</code></pre>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">前の行の売上</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
</tr>
</tbody>
</table>

</div>
<h3><span id="toc9">症状・原因・確認方法・修正方法</span></h3>


<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">確認項目</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">内容</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">症状</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">8月1日の「前の行」に8月3日の売上<code>90</code>が入る</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">原因</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>shift()</code>の実行前に日付順へ並べていない</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">確認方法</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">日付列と行順を表示し、昇順になっているか確認する</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">修正方法</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>sort_values('日付')</code>を実行してから<code>shift(1)</code>を使う</td>
</tr>
</tbody>
</table>

</div>
<p>この結果の<code>90</code>を「前日売上」と呼ぶのは誤りです。8月1日の1つ前に<strong>並んでいる行</strong>が8月3日だから入った値であり、暦上の前日を表していません。</p>

<pre class="line-numbers"><code class="language-python">df_sorted = df_unsorted[["日付", "売上"]].sort_values("日付").reset_index(drop=True)
df_sorted["前日売上"] = df_sorted["売上"].shift(1)
df_sorted</code></pre>
<p><strong>実行結果</strong></p>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">90</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120.0</td>
    </tr>
  </tbody>
</table>
</div>
<p>修正後は、8月2日の前日売上に8月1日の<code>100</code>が入ります。日付が欠けている場合は前日ではなく前の観測行になるため、基本例で確認したとおり日付の連続性にも注意してください。</p>

<h2><span id="toc10">NaNは無条件に0で埋めない</span></h2>


<p><code>shift(1)</code>の先頭や<code>shift(-1)</code>の末尾に出る<code>NaN</code>は、比較元の行が存在しないことを表します。これは処理の失敗ではありません。</p>


<p>先頭の前日売上を<code>0</code>で埋めると、「前日の売上は0だった」という別の意味に変わります。その事実を確認できない場合は、<code>NaN</code>のまま残すか、比較計算から除外するのが安全です。</p>


<h3><span id="toc11">fill_valueを使う場合も値の意味を確認する</span></h3>


<p><code>shift(1, fill_value=0)</code>のように指定すると、移動によって空いた場所を<code>0</code>で埋められます。ただし、これは実際の前日売上を取得したわけではありません。<code>0</code>に分析上の根拠がある場合だけ使い、単に<code>NaN</code>を消す目的では使わないようにしましょう。</p>


<p>欠損値を何で埋めるかは分析目的によって異なります。<a href="https://pythondatalab.com/pandas-fillna/">「pandas fillna()の使い方」</a>で選択基準を確認してください。</p>

<h2><span id="toc12">「値をずらす」と「日付をずらす」は同じではない</span></h2>


<p>この記事の<code>df['売上'].shift(1)</code>は、<strong>売上の値を1行ずらし、比較元を作る処理</strong>です。日付列の値自体は変わりません。</p>


<p>一方、日付インデックスを持つデータでは、<code>freq</code>を指定してインデックスを時間方向へ移動する使い方もあります。これは行の値を前後比較する今回の目的とは挙動が異なります。初心者のうちは、まず<code>freq</code>を指定しない基本形で「行をずらす」考え方を身につければ十分です。</p>

<h2><span id="toc13">データ分析の流れでshift()を使う位置</span></h2>


<p>日別データで前日値を比較するときは、次の順番で進めます。</p>


<ol>
<li>DataFrameを読み込み、列名・値・データ型を確認する</li>
<li>日付列を<code>to_datetime()</code>で日付型へ変換する</li>
<li><code>sort_values()</code>で日付の昇順へ並べる</li>
<li><code>shift()</code>で比較元となる前の行の値を作る</li>
<li>目的に応じて差額・増減率を計算する</li>
<li>表やグラフで変化を確認する</li>
</ol>


<p>DataFrameの基本は<a href="https://pythondatalab.com/pandas-dataframe/">「Pandas DataFrame入門」</a>、列を追加する方法全般は<a href="https://pythondatalab.com/pandas-add-column/">「pandasで新しい列を追加する方法」</a>で確認できます。</p>


<p>自分のデータへ置き換えるときは、<strong>日付型・並び順・日付の欠け・比較元が存在しない行</strong>の4点を確認してください。</p>

<h2><span id="toc14">まとめ</span></h2>


<ul>
<li>前の行の値は<code>shift(1)</code>、2行前は<code>shift(2)</code>、次の行は<code>shift(-1)</code>で取得する</li>
<li><code>shift(1)</code>では値が1行下へずれ、各行に1行前の値が入る</li>
<li>先頭や末尾の<code>NaN</code>は比較元が存在しないことを示すため、根拠なく0で埋めない</li>
<li><code>shift()</code>は前後の値、<code>diff()</code>は差額、<code>pct_change()</code>は増減率、<code>rolling()</code>は一定範囲の集計値を求める</li>
<li><code>shift()</code>が参照するのは前日ではなく、現在の並び順における前の行である</li>
<li>日付データでは、日付型への変換と昇順への並び替えを済ませてから実行する</li>
</ul>


<p>比較元の値を残して計算過程を確かめたいときに<code>shift()</code>を使えば、前の行との比較を安全に組み立てられます。</p>

<h2><span id="toc15">関連記事</span></h2>


<ul>
<li><a href="https://pythondatalab.com/pandas-diff/">pandas diff()の使い方｜前の行との差分・前日からの増減を計算する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-pct-change/">pandas pct_change()の使い方｜前日比・増減率の計算方法</a></li>
<li><a href="https://pythondatalab.com/pandas-rolling/">pandas rolling()の使い方｜移動平均・window・NaNを初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門｜sort<em>values・sort</em>indexの違いと複数列ソート</a></li>
<li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換とformat・NaT対処</a></li>
<li><a href="https://pythondatalab.com/pandas-add-column/">pandasで新しい列を追加する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方｜欠損値を0・平均値・中央値で埋める方法</a></li>
</ul>

<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc16"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>

</div>
<script>Prism.highlightAll();</script>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1787982540051" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc17">shift(1)とshift(-1)の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>shift(1)</code>は各行に1行前の値を入れ、先頭が<code>NaN</code>になります。<code>shift(-1)</code>は各行に次の行の値を入れ、末尾が<code>NaN</code>になります。</p>

</div>
</div>
<div id="faq-question-1787982570541" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc18">先頭にNaNが出るのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>shift(1)</code>を実行した先頭行には、比較元となる1行前のデータがないためです。エラーではなく、比較不能であることを示す自然な結果です。</p>

</div>
</div>
<div id="faq-question-1787982582990" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc19">shift()とdiff()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>shift()</code>は前の行の値そのものを返し、<code>diff()</code>は現在値と前の行との差額を返します。比較元を確認したいなら<code>shift()</code>、差額だけが必要なら<code>diff()</code>を選びます。</p>

</div>
</div>
<div id="faq-question-1787982600620" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc20">shift()は必ず前日の値を取得しますか？</span></h3>
<div class="rank-math-answer ">

<p>いいえ。取得するのは現在の並び順における前の行です。前日値として扱うには、日付順に並んでいることに加え、必要に応じて日付の欠けも確認します。</p>

</div>
</div>
<div id="faq-question-1787982606963" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">shift()で生じたNaNを0で埋めてもよいですか？</span></h3>
<div class="rank-math-answer ">

<p>前の行の値が実際に0だったと判断できる場合に限ります。<code>fill_value=0</code>でも同じで、比較元が存在しないという意味を消すため、根拠なく指定しないでください。</p>

</div>
</div>
<div id="faq-question-1787982625152" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">Series.shift()とDataFrame.shift()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>Seriesに使うと1列の値、DataFrameに使うと対象DataFrame全体がずれます。この記事では比較対象を明確にするため、<code>df['売上'].shift()</code>というSeriesの形を使っています。</p>

</div>
</div>
<div id="faq-question-1787982635679" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">日付インデックスを1日ずらす処理と同じですか？</span></h3>
<div class="rank-math-answer ">

<p>同じではありません。この記事では<code>freq</code>を指定せず、値を行単位でずらしています。<code>freq</code>を指定する使い方は日付インデックスを時間方向へ移動するため、別の目的として区別してください。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-shift/">pandas shift()の使い方｜前の行・次の行の値を取得して比較する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-shift/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas pct_change()の使い方｜前日比・増減率の計算方法</title>
		<link>https://pythondatalab.com/pandas-pct-change/</link>
					<comments>https://pythondatalab.com/pandas-pct-change/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Tue, 25 Aug 2026 01:12:55 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2135</guid>

					<description><![CDATA[<p>pandasのpct_change()で前の行からの増減率や前日比を計算する方法を初心者向けに解説。0.1の読み方、パーセント表示、periods、NaN、比較元が0の場合、diff・shiftとの違いまで具体例で学べます。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-pct-change/">pandas pct_change()の使い方｜前日比・増減率の計算方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
.colab-article {
  max-width: 100%;
  overflow-wrap: anywhere;
}
.colab-article pre[class*="language-"] {
  box-sizing: border-box;
  max-width: 100%;
  margin: 0 !important;
  padding: 1em;
  overflow-x: auto;
}
.colab-article .colab-table-scroll {
  box-sizing: border-box;
  width: 100%;
  max-width: 100%;
  margin: 1em 0;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.colab-article table.wp-block-table {
  width: auto;
  min-width: max-content;
  border-collapse: collapse;
}
.colab-article table.wp-block-table th,
.colab-article table.wp-block-table td {
  border: 1px solid #d0d7de;
}
.colab-article .colab-figure {
  margin: 1em 0;
  text-align: center;
}
.colab-article .colab-figure img {
  display: block;
  width: auto;
  max-width: 100%;
  height: auto;
  margin: 0 auto;
}
.colab-article .colab-figure figcaption {
  margin-top: 0.4em;
  color: #555;
  font-size: 0.9em;
}
.colab-article .colab-formula {
  overflow-x: auto;
}
</style>
<div class="colab-article">

<p>日別売上を見て、「前日より100円増えた」ことは分かっても、「何％増えたか」の計算で迷うことはありませんか。</p>
<p>Pandasでは、前の行からの<strong>増減率</strong>を<code>pct_change()</code>で計算できます。</p>
<pre class="line-numbers"><code class="language-python">df["前日比"] = df["売上"].pct_change(fill_method=None)</code></pre>
<p>最初に覚えるポイントは3つです。</p>
<ol>
  <li>結果の<code>0.1</code>は<strong>10％増加</strong>を表す</li>
  <li>最初の行は比較元がないため<code>NaN</code>になる</li>
  <li>比較するのは暦上の前日ではなく<strong>データ上の前の行</strong></li>
</ol>
<p>したがって「前日比」と呼べるのは、日付が1日間隔で古い順に並んでいる場合です。この記事では日別売上を例に、基本的な使い方から結果の読み方、<code>periods</code>、0や欠損値の注意点まで解説します。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：増減率を求めるならpct_change()を使う</a></li><li><a href="#toc3" tabindex="0">pct_change()の計算式と結果の読み方</a></li><li><a href="#toc4" tabindex="0">日別売上のサンプルデータを用意する</a></li><li><a href="#toc5" tabindex="0">pct_change()の前に日付型と並び順を確認する</a></li><li><a href="#toc6" tabindex="0">pct_change()で前の行からの増減率を計算する</a></li><li><a href="#toc7" tabindex="0">どの値と比較したかを表で確認する</a></li><li><a href="#toc8" tabindex="0">増減率をパーセントで表示する</a></li><li><a href="#toc9" tabindex="0">periodsで2行前からの増減率を計算する</a></li><li><a href="#toc10" tabindex="0">正の値・負の値・0・NaNをどう読むか</a></li><li><a href="#toc11" tabindex="0">コードは動くが結果を誤解しやすい場面</a><ol><li><a href="#toc12" tabindex="0">前の行は必ずしも前日ではない</a></li><li><a href="#toc13" tabindex="0">比較元が0の場合は無限大になる</a></li><li><a href="#toc14" tabindex="0">欠損値を安易に0で埋めない</a></li><li><a href="#toc15" tabindex="0">日付を並び替えないと計算結果が変わる</a></li></ol></li><li><a href="#toc16" tabindex="0">日別売上と前日比を折れ線グラフで確認する</a></li><li><a href="#toc17" tabindex="0">データ分析の流れでpct_change()を使う位置</a></li><li><a href="#toc18" tabindex="0">まとめ</a></li><li><a href="#toc19" tabindex="0">関連記事</a><ol><li><a href="#toc20" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc21" tabindex="0">pct_change()の0.1は何％ですか？</a></li><li><a href="#toc22" tabindex="0">最初の行がNaNになるのはなぜですか？</a></li><li><a href="#toc23" tabindex="0">前日比と前月比は計算できますか？</a></li><li><a href="#toc24" tabindex="0">pct_change()とdiff()の違いは何ですか？</a></li><li><a href="#toc25" tabindex="0">比較元が0の場合はどうなりますか？</a></li><li><a href="#toc26" tabindex="0">欠損値がある場合はどうなりますか？</a></li><li><a href="#toc27" tabindex="0">結果をパーセント表示できますか？</a></li><li><a href="#toc28" tabindex="0">前日比が合わないのはなぜですか？</a></li><li><a href="#toc29" tabindex="0">DataFrameの複数列にも使えますか？</a></li><li><a href="#toc30" tabindex="0">axisやfreqも覚える必要がありますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
  <li><code>pct_change()</code>で前の行からの増減率を求める方法</li>
  <li><code>0.1</code>や<code>-0.2</code>をパーセントで読む方法</li>
  <li>最初の行が<code>NaN</code>になる理由</li>
  <li><code>periods</code>で比較する行を変える方法</li>
  <li>日付の並び、欠損値、比較元が0の場合の注意点</li>
  <li><code>diff()</code>・<code>shift()</code>・<code>rolling()</code>との使い分け</li>
</ul>
<p>この記事のゴールは、日付と行順を確認してから<code>pct_change()</code>を使い、増減率を正しく計算・解釈できるようになることです。</p>
<h2><span id="toc2">先に結論：増減率を求めるならpct_change()を使う</span></h2>
<p>似た処理は、知りたい内容によって使い分けます。</p>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">機能</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">何を求めるか</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">主な注意点</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>pct_change()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行からの増減率</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">前日比・前月比を知りたい</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">結果は割合。<code>0.1</code>は10％</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>diff()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行との差</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">何円・何個増えたか知りたい</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">単位は元データと同じ</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>shift()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行の値</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">現在値と比較元を並べたい</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">それ自体は差や率を計算しない</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>rolling()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近数行の集計値</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">移動平均で変動を滑らかにしたい</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">増減率を求める処理ではない</td>
      </tr>
    </tbody>
  </table>
</div>
<p>たとえば、売上が1,000円から1,100円になった場合、<code>diff()</code>の結果は100円、<code>pct_change()</code>の結果は0.1、つまり10％です。</p>
<p><strong>増減した量なら<code>diff()</code>、増減した割合なら<code>pct_change()</code></strong>と判断すると迷いにくくなります。</p>
<h2><span id="toc3">pct_change()の計算式と結果の読み方</span></h2>
<p><code>pct_change()</code>は、現在の値を前の行と比べて、どれだけ増減したかを割合で返します。</p>
<p class="colab-formula"><code>増減率 = (現在の値 − 前の行の値) ÷ 前の行の値</code></p>
<p>結果を読むときは、<strong>符号</strong>と<strong>100倍した値</strong>に注目します。</p>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">結果</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">パーセントでの読み方</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">意味</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>0.10</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">10％</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">10％増加</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>-0.20</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-20％</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">20％減少</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>0.00</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0％</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">変化なし</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>1.00</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100％</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2倍になった</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>-1.00</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-100％</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0になった</td>
      </tr>
    </tbody>
  </table>
</div>
<p>たとえば<code>0.1</code>は0.1％ではなく、10％増加です。</p>
<h2><span id="toc4">日別売上のサンプルデータを用意する</span></h2>
<p>ここでは、5日分の日付と売上を持つDataFrameを使います。Google Colabで上から順番に実行できます。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd
import numpy as np

df = pd.DataFrame({
    "日付": ["2026-08-18", "2026-08-19", "2026-08-20", "2026-08-21", "2026-08-22"],
    "売上": [1000, 1100, 990, 990, 1188]
})

df</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-18</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-19</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-20</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-21</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-22</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1188</td>
      </tr>
    </tbody>
  </table>
</div>
<p>売上は1,000円、1,100円、990円、990円、1,188円と変化しています。この同じデータで、差額と増減率の違いを確認します。</p>
<h2><span id="toc5">pct_change()の前に日付型と並び順を確認する</span></h2>
<p><code>pct_change()</code>は、日付の意味を読み取って「前日」を探すのではなく、<strong>現在の行と前の行</strong>を比較します。そのため、計算前に日付型へ変換し、古い日付から並べることが重要です。</p>
<pre class="line-numbers"><code class="language-python">df["日付"] = pd.to_datetime(df["日付"])
df = df.sort_values("日付").reset_index(drop=True)

df.dtypes</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">0</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">datetime64[ns]</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">int64</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>日付</code>が<code>datetime64[ns]</code>になっていることを確認します。そのうえで<code>sort_values()</code>を使い、日付の昇順に整えています。</p>
<p>日付変換の詳細は「pandas to_datetime()の使い方」、並び替えは「pandas 並び替え（sort）入門」で確認できます。</p>
<h2><span id="toc6">pct_change()で前の行からの増減率を計算する</span></h2>
<p>売上列に<code>pct_change()</code>を使います。<code>fill_method=None</code>を明示すると、欠損値を自動的に前の値で補わずに計算できます。</p>
<pre class="line-numbers"><code class="language-python">df["前日比"] = df["売上"].pct_change(fill_method=None)

df</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日比</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-18</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-19</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-20</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.1</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-21</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-22</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1188</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.2</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>前日比</code>列では、2行目が<code>0.1</code>、3行目が<code>-0.1</code>、4行目が<code>0.0</code>、5行目が<code>0.2</code>になります。</p>
<ul>
  <li>1,000円から1,100円：10％増加</li>
  <li>1,100円から990円：10％減少</li>
  <li>990円から990円：変化なし</li>
  <li>990円から1,188円：20％増加</li>
</ul>
<p>最初の行が<code>NaN</code>になるのは、比較する前の行が存在しないためです。エラーではありません。</p>
<h2><span id="toc7">どの値と比較したかを表で確認する</span></h2>
<p>結果だけでは計算の向きが分かりにくいため、<code>shift()</code>で比較元、<code>diff()</code>で増減額を表示します。現在値・比較元・結果を横に並べると、どの値を分母にしたか確認できます。</p>
<pre class="line-numbers"><code class="language-python">comparison = df[["日付", "売上"]].copy()
comparison["前の行の売上"] = comparison["売上"].shift(1)
comparison["増減額"] = comparison["売上"].diff()
comparison["増減率"] = comparison["売上"].pct_change(fill_method=None)
comparison["増減率（%）"] = comparison["増減率"] * 100

comparison</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前の行の売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減額</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減率</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減率（%）</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-18</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-19</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">10.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-20</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-110.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-10.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-21</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-22</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1188</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">198.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">20.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>2行目では、現在の売上1,100円から比較元の1,000円を引き、その100円を1,000円で割っています。</p>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">現在の売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前の行の売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減額</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">計算</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減率</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1,100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>(1100 - 1000) / 1000</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.10＝10％</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-110</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>(990 - 1100) / 1100</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.10＝-10％</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>(990 - 990) / 990</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.00＝0％</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1,188</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">198</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>(1188 - 990) / 990</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.20＝20％</td>
      </tr>
    </tbody>
  </table>
</div>
<p>役割は次のように整理できます。</p>
<ul>
  <li><code>shift()</code>：比較元の値を確認する</li>
  <li><code>diff()</code>：増減した量を求める</li>
  <li><code>pct_change()</code>：増減した割合を求める</li>
</ul>
<h2><span id="toc8">増減率をパーセントで表示する</span></h2>
<p><code>pct_change()</code>の結果を数値としてパーセントに直す場合は、100を掛けます。分析に使える数値のまま保持するため、<code>%</code>記号を含む文字列には変換しません。</p>
<pre class="line-numbers"><code class="language-python">df["前日比（%）"] = (df["前日比"] * 100).round(1)

df[["日付", "売上", "前日比", "前日比（%）"]]</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日比</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日比（%）</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-18</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-19</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">10.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-20</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-10.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-21</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-22</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1188</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">20.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>前日比</code>の0.1と、<code>前日比（%）</code>の10.0は同じ変化を表します。前者は割合、後者は100倍したパーセント値です。</p>
<p>列を追加する基本については「pandasで新しい列を追加する方法」で詳しく確認できます。</p>
<h2><span id="toc9">periodsで2行前からの増減率を計算する</span></h2>
<p><code>periods</code>は、何行前と比較するかを指定する引数です。初期値は1です。<code>periods=2</code>にすると2行前と比較します。</p>
<pre class="line-numbers"><code class="language-python">df["2行前比"] = df["売上"].pct_change(periods=2, fill_method=None)
df["2行前比（%）"] = (df["2行前比"] * 100).round(1)

df[["日付", "売上", "2行前比", "2行前比（%）"]]</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">2行前比</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">2行前比（%）</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-18</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-19</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-20</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-1.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-21</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">990</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.10</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-10.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-22</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1188</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.20</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">20.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>最初の2行は、2行前の比較元がないため<code>NaN</code>になります。</p>
<p>3行目の売上990円は2行前の1,000円と比べて1％減少、4行目の990円は2行前の1,100円と比べて10％減少、5行目の1,188円は2行前の990円と比べて20％増加しています。</p>
<p><code>periods=2</code>は「2日前」ではなく<strong>2行前</strong>です。日付が1日間隔で並んでいるときだけ、2日前との比較と一致します。</p>
<h2><span id="toc10">正の値・負の値・0・NaNをどう読むか</span></h2>
<p>結果は次のように読みます。</p>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">結果</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">判断</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">正の値</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">比較元より増加</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">負の値</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">比較元より減少</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>0.0</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">比較元から変化なし</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>NaN</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">比較元がない、または計算に必要な値が欠けている</td>
      </tr>
    </tbody>
  </table>
</div>
<p>注意したいのは0です。100から0への変化は-100％ですが、0から100への増加率は計算できません。比較元の0を分母にできないため、増加と減少は単純に対称にはなりません。</p>
<h2><span id="toc11">コードは動くが結果を誤解しやすい場面</span></h2>
<h3><span id="toc12">前の行は必ずしも前日ではない</span></h3>
<p>次のデータでは、8月19日の次が8月22日です。<code>pct_change()</code>は8月22日を8月19日と比較します。</p>
<pre class="line-numbers"><code class="language-python">business_days = pd.DataFrame({
    "日付": pd.to_datetime(["2026-08-18", "2026-08-19", "2026-08-22"]),
    "売上": [1000, 1100, 1210]
})

business_days["前の行からの増減率"] = business_days["売上"].pct_change(fill_method=None)
business_days</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前の行からの増減率</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-18</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-19</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-22</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1210</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1</td>
      </tr>
    </tbody>
  </table>
</div>
<p>8月22日の結果は10％ですが、これは8月21日との前日比ではなく、<strong>データ上の前の行である8月19日からの増減率</strong>です。</p>
<p>営業日データなら「前営業日比」と呼べます。暦上の前日比が必要な場合は、日付の間隔を確認し、必要に応じて日次の行をそろえてから計算します。月次データなら同じ考え方で前月比を計算できます。</p>
<h3><span id="toc13">比較元が0の場合は無限大になる</span></h3>
<p>比較元が0の場合、増減率の計算では0による割り算が発生します。</p>
<pre class="line-numbers"><code class="language-python">zero_example = pd.DataFrame({
    "売上": [100, 0, 50]
})

zero_example["増減率"] = zero_example["売上"].pct_change(fill_method=None)
zero_example</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減率</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-1.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">50</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">inf</td>
      </tr>
    </tbody>
  </table>
</div>
<p>100から0への変化は<code>-1.0</code>、つまり-100％です。一方、0から50への変化は<code>inf</code>（無限大）になります。</p>
<p>これはコードの失敗ではなく、比較元が0なので通常の増減率を定義できないためです。0を都合のよい別の値に置き換えるのではなく、元データで0が何を意味するか確認し、必要なら該当行を別扱いにします。</p>
<h3><span id="toc14">欠損値を安易に0で埋めない</span></h3>
<p>欠損値があるデータでは、比較に必要な値がそろわない行が<code>NaN</code>になります。</p>
<pre class="line-numbers"><code class="language-python">missing_example = pd.DataFrame({
    "売上": [100, np.nan, 120]
})

missing_example["増減率"] = missing_example["売上"].pct_change(fill_method=None)
missing_example</code></pre>
<div class="colab-table-scroll">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減率</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
    </tbody>
  </table>
</div>
<p>2行目は現在値が欠損し、3行目は比較元となる2行目が欠損しているため、どちらも増減率を計算できません。</p>
<p>欠損値を0で埋めてから計算すると、実際には観測されていない「売上0円」を作り、-100％や<code>inf</code>を発生させる可能性があります。補完する場合は、列の意味と欠損理由を確認してください。欠損値の扱いは「pandas fillna()の使い方」で詳しく解説しています。</p>
<p>Pandasのバージョンによる欠損値補完の挙動へ依存しないよう、この記事では<code>fill_method=None</code>を明示しています。</p>
<h3><span id="toc15">日付を並び替えないと計算結果が変わる</span></h3>
<p><code>pct_change()</code>は現在の行順を使います。日付が降順や不規則な順番のままでもコードは動きますが、前日比としては誤った結果になることがあります。</p>
<p>計算前に次の3点を確認します。</p>
<ol>
  <li>日付列がdatetime型になっている</li>
  <li>日付が古い順に並んでいる</li>
  <li>各行の日付間隔が目的に合っている</li>
</ol>
<p>CSVを読み込んだ直後は、<code>head()</code>・<code>dtypes</code>・日付の並びを確認してから計算すると安全です。</p>
<h2><span id="toc16">日別売上と前日比を折れ線グラフで確認する</span></h2>
<p>最後に、売上と前日比を同じ期間で可視化します。左軸が売上、右軸が前日比です。日本語をColabで表示するため、最初の実行時に<code>japanize-matplotlib</code>を読み込みます。</p>
<pre class="line-numbers"><code class="language-python">%pip -q install japanize-matplotlib

import matplotlib.pyplot as plt
import japanize_matplotlib

fig, ax1 = plt.subplots(figsize=(9, 5))

ax1.plot(df["日付"], df["売上"], marker="o", color="tab:blue", label="売上")
ax1.set_xlabel("日付")
ax1.set_ylabel("売上（円）", color="tab:blue")
ax1.tick_params(axis="y", labelcolor="tab:blue")
ax1.grid(alpha=0.3)

ax2 = ax1.twinx()
ax2.plot(df["日付"], df["前日比（%）"], marker="s", color="tab:red", label="前日比")
ax2.axhline(0, color="gray", linewidth=1)
ax2.set_ylabel("前日比（%）", color="tab:red")
ax2.tick_params(axis="y", labelcolor="tab:red")

lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc="upper left")

plt.title("日別売上と前日比の推移")
fig.autofmt_xdate()
plt.tight_layout()
plt.show()</code></pre>

<figure class="colab-figure">
  <img decoding="async" src="data:image/png;base64,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vr6iQ4cOIiIiQkRERIiDBw9KVrctY6aWwVzNj5laBnM1P2ZqfszUMpir+TFTsja7WXglIiICNWvWxLp162AymSCXF05Sfvnll9ixYwe+++47qNVqXLp0CYmJidDpdOjYsaPEVds2ZmoZzNX8mKllMFfzY6bmx0wtg7maHzMlq5K6yzSXn376SchkMrF//34hROHFi4UQYsOGDSI4OFjodDopyyuTmKllMFfzY6aWwVzNj5maHzO1DOZqfsyUrMkuzskDgOeeew6jRo3CiBEjsG/fvuJvRy5fvozBgwdzydnHwEwtg7maHzO1DOZqfszU/JipZTBX82OmZE12c7hmkaFDh+LQoUNo1qwZoqKiUFBQgJUrV6JevXpSl1ZmMVPLYK7mx0wtg7maHzM1P2ZqGczV/JgpWYPdNXkFBQW4dOkSzpw5AwAYNGiQxBWVfczUMpir+TFTy2Cu5sdMzY+ZWgZzNT9mStZgd00eERERERFReWY35+QRERERERERmzwiIiIiIiK7wiaPiIiIiIjIjrDJIyIiIiIisiNs8oiIiIiIiOwImzwiIiIiIiI7wiaPiIgIgNFolLoEIiIis2CTR0REdmXOnDnw9PR84H8///zzPY/r1q0bNm7ceM/t169fR0BAgDVKJyIiMgs2eUREZFc0Gg0GDx6MzMzMUv+rX78+9Hr9PY/Zu3cvWrRoIVHVRERE5sMmj4iIyr3NmzcjIiICQUFBUpdCRET0nymlLoCIiEhqX3zxBVq2bIlevXph586dJe4TQiA7Oxuenp6oXLkyzpw5I1GVREREj4ZNHhERlWt79uzB/v370bJlS/zwww/33J+ZmYmAgABkZmZavzgiIqLHwMM1iYjI7ixduvS+i678+eefxdvp9XqMGzcOTz31VPFte/fuxaJFi6Qom4iIyCzY5BERkd159dVX77vwyt2Lq+zbtw+NGjXCs88+W3xbzZo1MXfuXBw4cECK0omIiP4zNnlERFRutW/fHp999lmJ24KCgjB//nyMHDkSOp1OosqIiIgeH8/JIyKics3Z2fme2/r374+YmBgYDAYJKiIiIvpv2OQRERH9g0wmwwcffAAAnM0jIqIyh4drEhGR3XnUhVceJD4+HhkZGUhNTYVMJrNwxURERObDmTwiIrIro0ePxogRIxAcHFzq/VFRUfDz83vo8yxfvhyLFy9Gbm5uidU3iYiIbJ1MCCGkLoKIiIiIiIjMg4drEhERERER2RE2eURERERERHaETR4REREREZEdYZNHRERERERkR9jkERERERER2RE2eURERERERHaETR4REREREZEdYZNHRERERERkR9jkERERERER2RE2eURERERERHbk/1ECRHXW6IGPAAAAAElFTkSuQmCC
" alt="日別売上と前日比の推移を示す折れ線グラフ">
  <figcaption>日別売上と前日比の推移</figcaption>
</figure>
<p>売上が同じ990円だった8月21日は前日比が0％、1,188円へ増えた8月22日は20％になります。</p>
<p>グラフでは、売上の水準と増減率を混同しないことが重要です。売上が最も大きい日と、増加率が最も大きい日は必ずしも一致しません。折れ線グラフの基本設定は「Matplotlib 折れ線グラフ入門」で確認できます。</p>
<h2><span id="toc17">データ分析の流れでpct_change()を使う位置</span></h2>
<p><code>pct_change()</code>は、データを読み込んですぐ使うのではなく、日付と値を確認した後の「変化を計算する」段階で使用します。</p>
<ol>
  <li>CSVなどからDataFrameを読み込む</li>
  <li><code>head()</code>や<code>dtypes</code>で内容を確認する</li>
  <li><code>to_datetime()</code>で日付型へ変換する</li>
  <li><code>sort_values()</code>で日付順に並べる</li>
  <li><code>pct_change()</code>で増減率を計算する</li>
  <li><code>rolling()</code>や折れ線グラフで傾向を確認する</li>
</ol>
<p>期間ごとの合計値を作る場合は、先に<code>resample()</code>で月次などへ集計してから<code>pct_change()</code>を使います。移動平均で短期変動を滑らかにする場合は「pandas rolling()の使い方」、期間集計は「pandas resample()の使い方」を参照してください。</p>
<h2><span id="toc18">まとめ</span></h2>
<ul>
  <li><code>pct_change()</code>は前の行からの<strong>増減率</strong>を計算する</li>
  <li><code>0.1</code>は10％増加、<code>-0.2</code>は20％減少を表す</li>
  <li>最初の行は比較元がないため<code>NaN</code>になる</li>
  <li><code>periods=2</code>は2日前ではなく2行前との比較になる</li>
  <li>前日比として使う前に、日付型・並び順・日付間隔を確認する</li>
  <li>比較元が0の場合は<code>inf</code>、欠損値を含む比較は<code>NaN</code>になることがある</li>
  <li>増減量は<code>diff()</code>、比較元は<code>shift()</code>、平滑化は<code>rolling()</code>を使う</li>
</ul>
<p>まずは「割合なら<code>pct_change()</code>」「量なら<code>diff()</code>」と使い分けましょう。そのうえで、結果が前日比・前営業日比・前月比のどれに当たるかを確認することが大切です。</p>
<h2><span id="toc19">関連記事</span></h2>
<ul>
  <li><a href="https://pythondatalab.com/pandas-diff/">pandas diff()の使い方｜前の行との差分・前日からの増減を計算する方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-rolling/">pandas rolling()の使い方｜移動平均・window・NaNを初心者向けに解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方｜日付データを月別・週別に集計する方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門｜sort_values・sort_indexの違い</a></li>
  <li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換とNaT対処</a></li>
  <li><a href="https://pythondatalab.com/pandas-add-column/">pandasで新しい列を追加する方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方｜欠損値を埋める方法</a></li>
  <li><a href="https://pythondatalab.com/matplotlib-line-legend-color/">Matplotlib 折れ線グラフ入門</a></li>
  <li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方と基本操作</a></li>
</ul>
<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc20"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p></div>
<script>Prism.highlightAll();</script>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1787619593495" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">pct_change()の0.1は何％ですか？</span></h3>
<div class="rank-math-answer ">

<p>10％です。<code>pct_change()</code>は割合を返すため、パーセントで読むときは100を掛けます。<code>-0.2</code>なら20％減少です。</p>

</div>
</div>
<div id="faq-question-1787619623353" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">最初の行がNaNになるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>比較する前の行が存在しないためです。エラーではなく、計算に必要な比較元がないことを表しています。</p>

</div>
</div>
<div id="faq-question-1787619636868" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">前日比と前月比は計算できますか？</span></h3>
<div class="rank-math-answer ">

<p>計算できます。ただし、<code>pct_change()</code>は日付ではなく前の行と比較します。日次データを日付順に並べれば前日比、月次データを月順に並べれば前月比として使えます。日付が欠けている場合は、前営業日比などになる点に注意してください。</p>

</div>
</div>
<div id="faq-question-1787619643328" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">pct_change()とdiff()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>pct_change()</code>は増減率、<code>diff()</code>は増減量を求めます。1,000円から1,100円になった場合、<code>pct_change()</code>は0.1（10％）、<code>diff()</code>は100円です。</p>

</div>
</div>
<div id="faq-question-1787619655129" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">比較元が0の場合はどうなりますか？</span></h3>
<div class="rank-math-answer ">

<p>0で割ることになるため、増加時には<code>inf</code>が返ることがあります。通常の増減率を定義できない状態なので、0が何を意味するか確認し、別扱いを検討します。</p>

</div>
</div>
<div id="faq-question-1787619676916" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">欠損値がある場合はどうなりますか？</span></h3>
<div class="rank-math-answer ">

<p><code>fill_method=None</code>を指定した場合、現在値または比較元が欠損している行は<code>NaN</code>になります。欠損値を埋める場合は、データ上の意味を確認してから処理してください。</p>

</div>
</div>
<div id="faq-question-1787619688702" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">結果をパーセント表示できますか？</span></h3>
<div class="rank-math-answer ">

<p>結果に100を掛ければパーセント値になります。計算に使う場合は、<code>%</code>記号を付けた文字列ではなく数値のまま保存する方が扱いやすくなります。</p>

</div>
</div>
<div id="faq-question-1787619696618" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">前日比が合わないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>日付の並び順、日付の欠け、重複日付、欠損値、比較元が0でないかを確認してください。<code>pct_change()</code>が比較するのは暦上の前日ではなく、現在の並びで1つ前にある行です。</p>

</div>
</div>
<div id="faq-question-1787619706498" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">DataFrameの複数列にも使えますか？</span></h3>
<div class="rank-math-answer ">

<p>使えます。<code>df[["売上", "客数"]].pct_change(fill_method=None)</code>のように指定すると、売上と客数を列ごとに計算します。最初は、この記事のように1列ずつ結果を確認する方が理解しやすいでしょう。</p>

</div>
</div>
<div id="faq-question-1787619717509" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">axisやfreqも覚える必要がありますか？</span></h3>
<div class="rank-math-answer ">

<p>通常の前日比・前月比では、まず初期設定の行方向だけ理解すれば十分です。列方向を比較する<code>axis</code>や、日時オフセットを使う<code>freq</code>は発展的な指定なので、必要になった段階で確認しましょう。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-pct-change/">pandas pct_change()の使い方｜前日比・増減率の計算方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-pct-change/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas diff()の使い方｜前の行との差分・前日からの増減を計算する方法</title>
		<link>https://pythondatalab.com/pandas-diff/</link>
					<comments>https://pythondatalab.com/pandas-diff/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 22 Aug 2026 13:33:35 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2127</guid>

					<description><![CDATA[<p>日別売上を見ながら、「前日よりいくら増えたのか」を1行ずつ計算するのは大変です。pandasのdiff()を使えば、現在の行から1つ前の行を引いた差分をまとめて計算できます。 先に結論を示すと、前の行からの増減「量」を求 [&#8230;]</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-diff/">pandas diff()の使い方｜前の行との差分・前日からの増減を計算する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<div class="colab-article">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
  <script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
  <style>
    .colab-article pre[class*="language-"] { margin: 0 !important; padding: 1em; }
    .colab-article table.wp-block-table th, .colab-article table.wp-block-table td { border: 1px solid #d0d0d0; }
    .colab-article .colab-figure { margin: 1em 0; }
    .colab-article .colab-figure img { max-width: 100%; height: auto; }
  </style>


<p>日別売上を見ながら、「前日よりいくら増えたのか」を1行ずつ計算するのは大変です。pandasの<code>diff()</code>を使えば、<strong>現在の行から1つ前の行を引いた差分</strong>をまとめて計算できます。</p>

<p>先に結論を示すと、前の行からの増減「量」を求める基本形は<code>df["売上"].diff()</code>です。ただし、<code>diff()</code>は日付そのものではなく、<strong>DataFrameの現在の行順</strong>に沿って計算します。時系列データでは、日付型への変換と日付順の並び替えを先に済ませることが重要です。</p>

<p>この記事では日別売上を例に、引き算の向き、先頭が<code>NaN</code>になる理由、<code>periods</code>の意味、<code>shift()</code>・<code>pct_change()</code>・<code>rolling()</code>との違いまで、Google Colabで実行しながら確認します。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：増減量を求めるならdiff()を使う</a></li><li><a href="#toc3" tabindex="0">日別売上のサンプルデータを用意する</a></li><li><a href="#toc4" tabindex="0">diff()の前に日付型と並び順を整える</a></li><li><a href="#toc5" tabindex="0">diff()で前の行との差を計算する</a><ol><li><a href="#toc6" tabindex="0">処理前・計算対象・処理後を表で確認する</a></li></ol></li><li><a href="#toc7" tabindex="0">diff()の結果を「前日差」列として追加する</a></li><li><a href="#toc8" tabindex="0">periodsで何行前と比較するかを変更する</a><ol><li><a href="#toc9" tabindex="0">periodsに負の値を指定するとどうなる？</a></li></ol></li><li><a href="#toc10" tabindex="0">並び順が違うとdiff()の結果も変わる</a></li><li><a href="#toc11" tabindex="0">前日差を正しく読むための2つの注意点</a><ol><li><a href="#toc12" tabindex="0">日付が欠けていると「前の行」と「前日」は一致しない</a></li><li><a href="#toc13" tabindex="0">途中に欠損値があると差分もNaNになる</a></li></ol></li><li><a href="#toc14" tabindex="0">diff()・shift()・pct_change()・rolling()を同じデータで比較する</a><ol><li><a href="#toc15" tabindex="0">補足：DataFrame全体や列方向にもdiff()を使える</a></li></ol></li><li><a href="#toc16" tabindex="0">diff()でよくあるミスと対処法</a><ol><li><a href="#toc17" tabindex="0">1. 日付順に並べず「前日差」と解釈する</a></li><li><a href="#toc18" tabindex="0">2. 先頭のNaNをエラーだと思う</a></li><li><a href="#toc19" tabindex="0">3. periodsを日数だと思う</a></li><li><a href="#toc20" tabindex="0">4. diff()を表示しただけで列が追加されたと思う</a></li><li><a href="#toc21" tabindex="0">5. 負の値を計算ミスだと思う</a></li><li><a href="#toc22" tabindex="0">6. 前日比率を求めたいのにdiff()を使う</a></li></ol></li><li><a href="#toc23" tabindex="0">データ分析の流れでdiff()を使う位置</a><ol><li><a href="#toc24" tabindex="0">売上と前日差をグラフで確認する</a></li></ol></li><li><a href="#toc25" tabindex="0">まとめ</a></li><li><a href="#toc26" tabindex="0">関連記事</a><ol><li><a href="#toc27" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc28" tabindex="0">pandasで前の行との差を求めるにはどうすればよいですか？</a></li><li><a href="#toc29" tabindex="0">diff()の先頭行がNaNになるのはなぜですか？</a></li><li><a href="#toc30" tabindex="0">diff()で前日差や前日比率を計算できますか？</a></li><li><a href="#toc31" tabindex="0">diff()のperiods=2は何を意味しますか？</a></li><li><a href="#toc32" tabindex="0">diff()とshift()の違いは何ですか？</a></li><li><a href="#toc33" tabindex="0">日付が連続していなくても前日差になりますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2 id="この記事でわかること"><span id="toc1">この記事でわかること</span></h2>

<ul>
<li><code>diff()</code>で前の行との差分を求める方法</li>
<li>差分が正・負・0になる意味</li>
<li>先頭行が<code>NaN</code>になる理由</li>
<li><code>periods</code>で比較する行を変える方法</li>
<li>日付順に並べてから計算する理由</li>
<li><code>diff()</code>・<code>shift()</code>・<code>pct_change()</code>・<code>rolling()</code>の使い分け</li>
<li>計算結果を「前日差」列としてDataFrameに追加する方法</li>
</ul>

<p>DataFrame自体がまだよく分からない場合は、先に<a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>を読むと理解しやすくなります。CSVから試したい場合は、<a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>も参考にしてください。</p>
<h2 id="先に結論増減量を求めるならdiffを使う"><span id="toc2">先に結論：増減量を求めるならdiff()を使う</span></h2>

<p><code>diff()</code>の標準の計算は、次のとおりです。</p>

<p><strong>現在の行の値 − 1つ前の行の値</strong></p>

<p>たとえば、前日の売上が1,000円、当日の売上が1,300円なら、差分は<code>300</code>です。前日より200円減った場合は<code>-200</code>になります。</p>

<p>目的が似ているメソッドは、求めたい結果で使い分けます。</p>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th style="white-space: nowrap; padding: 0.2em 0.4em;">メソッド</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">求められるもの</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">使う場面</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">結果のイメージ</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>diff()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行との差（増減量）</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前日より何円増えたか</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>300</code></td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>pct_change()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行からの変化率</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前日より何％増えたか</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>0.3</code>（30%）</td>
</tr>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>shift()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行の値そのもの</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前日の値を別の列に置く</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>1000</code></td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>rolling()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">直近数行の平均・合計など</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">日々の変動をならして傾向を見る</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均</td>
</tr>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>resample()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">日・週・月などの期間別集計</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">日別データを月別にまとめる</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">月間売上</td>
</tr>
</tbody>
</table>

<p>この記事の中心は、増減「量」を求める<code>diff()</code>です。移動平均は<a href="https://pythondatalab.com/pandas-rolling/">pandas rolling()の使い方</a>、期間別集計は<a href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方</a>で詳しく解説しています。</p>
<h2 id="日別売上のサンプルデータを用意する"><span id="toc3">日別売上のサンプルデータを用意する</span></h2>

<p>Google Colabで次のセルを実行してください。増加・減少・変化なしをすべて確認できるように、日付の順番を一部入れ替えたデータを用意します。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd

df = pd.DataFrame({
    &quot;日付&quot;: [&quot;2026-08-01&quot;, &quot;2026-08-03&quot;, &quot;2026-08-02&quot;, &quot;2026-08-04&quot;, &quot;2026-08-05&quot;, &quot;2026-08-06&quot;],
    &quot;売上&quot;: [1000, 1300, 1200, 1300, 1300, 1100]
})

df
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
      </tr>
    </tbody>
  </table>
</div>
<p>このまま<code>diff()</code>を使うと、表示されている行順で計算されます。8月3日の次に8月2日があるため、その結果を「前日差」とは呼べません。先に日付型と並び順を整えます。</p>
<h2 id="diffの前に日付型と並び順を整える"><span id="toc4">diff()の前に日付型と並び順を整える</span></h2>

<p>まず<code>to_datetime()</code>で日付列を日付型に変換し、<code>sort_values()</code>で昇順に並べます。並び替え後のインデックスも<code>reset_index(drop=True)</code>で振り直しておくと、行順を確認しやすくなります。</p>
<pre class="line-numbers"><code class="language-python">df[&quot;日付&quot;] = pd.to_datetime(df[&quot;日付&quot;])
df = df.sort_values(&quot;日付&quot;).reset_index(drop=True)

df
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
      </tr>
    </tbody>
  </table>
</div>
<p>日付の変換方法は<a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方</a>、並び替えの詳細は<a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門</a>で確認できます。</p>

<p>ここでは日付が1日刻みで連続しているため、1つ前の行との差を「前日差」として扱えます。</p>
<h2 id="diffで前の行との差を計算する"><span id="toc5">diff()で前の行との差を計算する</span></h2>

<p>売上列に<code>diff()</code>を使って、結果だけを確認します。</p>
<pre class="line-numbers"><code class="language-python">df[&quot;売上&quot;].diff()
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-200.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>結果は上から順に<code>NaN, 200, 100, 0, 0, -200</code>となります。<code>diff()</code>を実行しただけでは、元のDataFrameに列は追加されていません。</p>

<h3 id="処理前計算対象処理後を表で確認する"><span id="toc6">処理前・計算対象・処理後を表で確認する</span></h3>

<p>それぞれの行で行われている計算は次のとおりです。</p>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr class="header">
<th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">1つ前の売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">引き算</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"><code>diff()</code>の結果</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">なし</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">計算できない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>NaN</code></td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,200 − 1,000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">200</td>
</tr>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300 − 1,200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300 − 1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
</tr>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300 − 1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,100 − 1,300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">-200</td>
</tr>
</tbody>
</table>

<p><code>diff()</code>は逆向きではなく、<strong>現在行から前の行を引く</strong>処理です。したがって、結果の符号は次のように読みます。</p>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr class="header">
<th style="white-space: nowrap; padding: 0.2em 0.4em;">結果</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">意味</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">正の値</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行より増加</td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">負の値</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行より減少</td>
</tr>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">前の行から変化なし</td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>NaN</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">比較相手がない、または計算に必要な値が欠けている</td>
</tr>
</tbody>
</table>
<h2 id="diffの結果を前日差列として追加する"><span id="toc7">diff()の結果を「前日差」列として追加する</span></h2>

<p>分析しやすいように、差分を新しい列へ代入します。</p>
<pre class="line-numbers"><code class="language-python">df[&quot;前日差&quot;] = df[&quot;売上&quot;].diff()

df
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日差</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-200.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>これで元の売上と前日差を横に並べて確認できます。先頭行の<code>NaN</code>はエラーではありません。1行目には比較する前日の行がないためです。</p>

<p>整数の売上列でも、先頭に<code>NaN</code>が入るため、結果は通常<code>200.0</code>のような小数で表示されます。計算が間違っているわけではありません。列追加の基本は、<a href="https://pythondatalab.com/pandas-add-column/">pandasで新しい列を追加する方法</a>で詳しく解説しています。</p>
<h2 id="periodsで何行前と比較するかを変更する"><span id="toc8">periodsで何行前と比較するかを変更する</span></h2>

<p><code>diff()</code>の<code>periods</code>は、何行ずらした値と比較するかを指定します。標準は<code>periods=1</code>です。</p>

<p>ここで重要なのは、<code>periods=2</code>が必ず「2日前」を意味するわけではなく、<strong>2行前</strong>を意味することです。日付が毎日連続している場合に限り、2行前と2日前が一致します。</p>
<pre class="line-numbers"><code class="language-python">df[&quot;1行前との差&quot;] = df[&quot;売上&quot;].diff(periods=1)
df[&quot;2行前との差&quot;] = df[&quot;売上&quot;].diff(periods=2)

df[[&quot;日付&quot;, &quot;売上&quot;, &quot;1行前との差&quot;, &quot;2行前との差&quot;]]
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">1行前との差</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">2行前との差</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">300.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-200.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-200.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>比較対象は次のように変わります。</p>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr class="header">
<th style="white-space: nowrap; padding: 0.2em 0.4em;">設定</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">計算</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">最初に計算できる行</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>periods=1</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">現在行 − 1行前</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2行目</td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>periods=2</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">現在行 − 2行前</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">3行目</td>
</tr>
</tbody>
</table>

<p>たとえば8月3日の売上1,300円について、1行前との差は<code>1,300 − 1,200 = 100</code>、2行前との差は<code>1,300 − 1,000 = 300</code>です。</p>

<h3 id="periodsに負の値を指定するとどうなる"><span id="toc9">periodsに負の値を指定するとどうなる？</span></h3>

<p>負の値を指定すると、後ろの行と比較できます。たとえば<code>periods=-1</code>は「現在行 − 次の行」です。引き算の向きを混同しやすいため、初心者のうちは標準の<code>periods=1</code>を中心に使えば十分です。</p>
<pre class="line-numbers"><code class="language-python">df[[&quot;日付&quot;, &quot;売上&quot;]].assign(
    次の行との差=df[&quot;売上&quot;].diff(periods=-1)
)
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">次の行との差</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-200.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
    </tbody>
  </table>
</div>
<h2 id="並び順が違うとdiffの結果も変わる"><span id="toc10">並び順が違うとdiff()の結果も変わる</span></h2>

<p><code>diff()</code>は日付を見て自動的に前日を探すメソッドではありません。<strong>画面上の1つ前の行</strong>と比較します。</p>

<p>最初に用意した並び順のまま計算した場合と、日付順に整えてから計算した場合を比べます。</p>
<pre class="line-numbers"><code class="language-python">df_unsorted = pd.DataFrame({
    &quot;日付&quot;: pd.to_datetime([&quot;2026-08-01&quot;, &quot;2026-08-03&quot;, &quot;2026-08-02&quot;, &quot;2026-08-04&quot;]),
    &quot;売上&quot;: [1000, 1300, 1200, 1300]
})

変更前 = df_unsorted.assign(行間差=df_unsorted[&quot;売上&quot;].diff())

df_sorted = df_unsorted.sort_values(&quot;日付&quot;).reset_index(drop=True)
変更後 = df_sorted.assign(前日差=df_sorted[&quot;売上&quot;].diff())

print(&quot;変更前：日付順ではない状態&quot;)
display(変更前)
print(&quot;変更後：日付順に並べた状態&quot;)
display(変更後)
</code></pre>
<p>変更前：日付順ではない状態</p>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">行間差</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">300.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>変更後：日付順に並べた状態</p>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日差</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>変更前では8月2日の直前に8月3日があるため、8月2日の差は<code>1,200 − 1,300 = -100</code>です。これは前日差ではなく、単なる行間差です。変更後は8月1日、2日、3日、4日の順になるため、前日からの増減として解釈できます。</p>

<p>時系列データでは、<code>diff()</code>の直前に日付列と並び順を確認する習慣をつけましょう。</p>
<h2 id="前日差を正しく読むための2つの注意点"><span id="toc11">前日差を正しく読むための2つの注意点</span></h2>

<h3 id="日付が欠けていると前の行と前日は一致しない"><span id="toc12">日付が欠けていると「前の行」と「前日」は一致しない</span></h3>

<p>次は8月2日のデータがない例です。日付順には並んでいますが、8月3日の1つ前の行は8月1日です。</p>
<pre class="line-numbers"><code class="language-python">df_gap = pd.DataFrame({
    &quot;日付&quot;: pd.to_datetime([&quot;2026-08-01&quot;, &quot;2026-08-03&quot;, &quot;2026-08-04&quot;]),
    &quot;売上&quot;: [1000, 1300, 1200]
})

df_gap[&quot;前の行との差&quot;] = df_gap[&quot;売上&quot;].diff()
df_gap
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前の行との差</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">300.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-100.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>8月3日の結果<code>300</code>は、8月1日との比較です。8月2日の売上が存在しないため、厳密には「前日差」ではありません。</p>

<p>つまり、<code>diff(periods=1)</code>の<code>1</code>は1日ではなく1行です。「前日差」と表現する前に、日付が1日刻みで連続しているか確認してください。</p>
<h3 id="途中に欠損値があると差分もnanになる"><span id="toc13">途中に欠損値があると差分もNaNになる</span></h3>

<p>売上の途中に欠損値があると、その値を使う差分は計算できません。</p>
<pre class="line-numbers"><code class="language-python">df_missing = pd.DataFrame({
    &quot;日付&quot;: pd.date_range(&quot;2026-08-01&quot;, periods=5, freq=&quot;D&quot;),
    &quot;売上&quot;: [1000, 1200, None, 1500, 1600]
})

df_missing[&quot;前日差&quot;] = df_missing[&quot;売上&quot;].diff()
df_missing
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前日差</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1600.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
    </tbody>
  </table>
</div>
<p>8月3日は売上自体が欠損しているため<code>NaN</code>です。8月4日も、比較する1行前の8月3日が欠損しているため<code>NaN</code>になります。8月5日は8月4日の値があるため、再び計算できます。</p>

<p>欠損値を理由なく0で埋めると、「売上が本当に0だった」と解釈される恐れがあります。欠損が未記録なのか、売上0を意味するのかを確認してから処理してください。埋め方の判断は<a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方</a>で解説しています。</p>
<h2 id="diffshiftpct_changerollingを同じデータで比較する"><span id="toc14">diff()・shift()・pct_change()・rolling()を同じデータで比較する</span></h2>

<p>似た処理の違いを、同じ売上データで確認します。<code>shift(1)</code>は前の行の売上、<code>pct_change()</code>は変化率、<code>rolling(3).mean()</code>は直近3行の移動平均を返します。</p>
<pre class="line-numbers"><code class="language-python">df_compare = df[[&quot;日付&quot;, &quot;売上&quot;]].copy()
df_compare[&quot;前の行の値_shift&quot;] = df_compare[&quot;売上&quot;].shift(1)
df_compare[&quot;増減量_diff&quot;] = df_compare[&quot;売上&quot;].diff()
df_compare[&quot;増減率_pct_change&quot;] = df_compare[&quot;売上&quot;].pct_change(fill_method=None)
df_compare[&quot;3行移動平均_rolling&quot;] = df_compare[&quot;売上&quot;].rolling(3).mean()

df_compare
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">前の行の値_shift</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減量_diff</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">増減率_pct_change</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3行移動平均_rolling</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.200000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.083333</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1166.666667</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.000000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1266.666667</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.000000</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300.000000</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1300.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-200.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-0.153846</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1233.333333</td>
      </tr>
    </tbody>
  </table>
</div>
<p>たとえば8月2日は、前の行の値が1,000円、増減量が200円、増減率が0.2（20%）です。3行移動平均は3行分の値が揃う8月3日から計算されます。</p>

<ul>
<li><strong>何円変わったか</strong>を知りたい：<code>diff()</code></li>
<li><strong>何％変わったか</strong>を知りたい：<code>pct_change()</code></li>
<li><strong>前の値そのもの</strong>を使いたい：<code>shift()</code></li>
<li><strong>短期的な変動をならしたい</strong>：<code>rolling()</code></li>
</ul>

<p>目的を先に言葉にすると、メソッドを選びやすくなります。</p>
<h3 id="補足dataframe全体や列方向にもdiffを使える"><span id="toc15">補足：DataFrame全体や列方向にもdiff()を使える</span></h3>

<p>ここまでは、日別売上の前日差を求めるため、売上のSeriesに<code>diff()</code>を使いました。<code>diff()</code>は数値列からなるDataFrame全体にも使用でき、標準では各列について1つ前の行との差を計算します。文字列列などが含まれる場合は、差分を求めたい数値列を選んで実行するのが安全です。</p>

<p>また、<code>axis=1</code>を指定すると、同じ行にある列同士の差を計算できます。たとえば「4月売上」と「5月売上」の差を横方向に求める場合です。</p>
<pre class="line-numbers"><code class="language-python">df_monthly = pd.DataFrame({
    &quot;4月売上&quot;: [1000, 1500],
    &quot;5月売上&quot;: [1200, 1400]
}, index=[&quot;商品A&quot;, &quot;商品B&quot;])

df_monthly.diff(axis=1)
</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto;">
  <table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">4月売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">5月売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品A</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">200</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品B</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">-100</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>5月売上</code>列には「5月売上 − 4月売上」が表示されます。最初の<code>4月売上</code>列は左側に比較する列がないため<code>NaN</code>です。</p>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr class="header">
<th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">4月売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">5月売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">5月 − 4月</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">商品A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">200</td>
</tr>
<tr class="even">
<td style="white-space: nowrap; padding: 0.2em 0.4em;">商品B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,500</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1,400</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">-100</td>
</tr>
</tbody>
</table>

<p>ただし、時系列データの前日差を求める目的なら、対象の売上列に行方向の<code>diff()</code>を使う基本形を優先してください。列方向の差分は、月別列などが横に並んだデータで必要になったときに使えば十分です。</p>
<h2 id="diffでよくあるミスと対処法"><span id="toc16">diff()でよくあるミスと対処法</span></h2>

<h3 id="日付順に並べず前日差と解釈する"><span id="toc17">1. 日付順に並べず「前日差」と解釈する</span></h3>

<p><code>diff()</code>は現在の行順で計算します。時系列データでは、日付型への変換と並び替えを先に済ませます。</p>

<h3 id="先頭のnanをエラーだと思う"><span id="toc18">2. 先頭のNaNをエラーだと思う</span></h3>

<p>先頭行には比較する前の行がないため、標準では<code>NaN</code>になります。正常な結果なので、理由なく0で埋めないようにします。</p>

<h3 id="periodsを日数だと思う"><span id="toc19">3. periodsを日数だと思う</span></h3>

<p><code>periods=2</code>は2日前ではなく2行前との比較です。</p>

<h3 id="diffを表示しただけで列が追加されたと思う"><span id="toc20">4. diff()を表示しただけで列が追加されたと思う</span></h3>

<p><code>df["売上"].diff()</code>は結果を返しますが、元のDataFrameを変更しません。「前日差」列として残す場合は、新しい列へ代入します。</p>

<h3 id="負の値を計算ミスだと思う"><span id="toc21">5. 負の値を計算ミスだと思う</span></h3>

<p>標準の<code>diff()</code>は現在行から前の行を引きます。負の値は、前の行より減少したことを示します。</p>

<h3 id="前日比率を求めたいのにdiffを使う"><span id="toc22">6. 前日比率を求めたいのにdiff()を使う</span></h3>

<p><code>diff()</code>が返すのは増減量です。「前日より何％増えたか」を求める場合は<code>pct_change()</code>を選びます。</p>
<h2 id="データ分析の流れでdiffを使う位置"><span id="toc23">データ分析の流れでdiff()を使う位置</span></h2>

<p><code>diff()</code>は、読み込んだデータを確認・整形したあとに、変化を表す列を作る処理として使えます。</p>

<ol type="1">
<li>CSVをDataFrameに読み込む</li>
<li><code>head()</code>や<code>info()</code>で列とデータ型を確認する</li>
<li>日付列を<code>to_datetime()</code>で日付型に変換する</li>
<li><code>sort_values()</code>で日付順に並べる</li>
<li><code>diff()</code>で前の行からの増減列を作る</li>
<li>増減が大きい日を確認する</li>
<li>必要に応じて<code>rolling()</code>や<code>resample()</code>で傾向を集計する</li>
<li>折れ線グラフなどで可視化する</li>
</ol>

<p>このように、<code>diff()</code>はデータの確認・前処理から時系列分析や可視化へ進む橋渡しになります。</p>
<h3 id="売上と前日差をグラフで確認する"><span id="toc24">売上と前日差をグラフで確認する</span></h3>

<p>最後に、売上と前日差を上下2つの折れ線グラフで確認します。尺度が異なるため、同じ軸へ無理に重ねず、グラフを分けます。</p>

<p>Google Colabで日本語のタイトルや軸ラベルを文字化けさせないため、最初に次のセルを1回実行して<code>japanize_matplotlib</code>を読み込みます。</p>
<pre class="line-numbers"><code class="language-python">%pip install -q japanize-matplotlib
import japanize_matplotlib

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 1, figsize=(9, 6), sharex=True)

axes[0].plot(df[&quot;日付&quot;], df[&quot;売上&quot;], marker=&quot;o&quot;)
axes[0].set_ylabel(&quot;売上&quot;)
axes[0].set_title(&quot;日別売上&quot;)
axes[0].grid(alpha=0.3)

axes[1].plot(df[&quot;日付&quot;], df[&quot;前日差&quot;], marker=&quot;o&quot;, color=&quot;tab:orange&quot;)
axes[1].axhline(0, color=&quot;gray&quot;, linewidth=1)
axes[1].set_ylabel(&quot;前日差&quot;)
axes[1].set_xlabel(&quot;日付&quot;)
axes[1].set_title(&quot;前日からの増減&quot;)
axes[1].grid(alpha=0.3)

fig.autofmt_xdate()
plt.tight_layout()
plt.show()
</code></pre>
<figure class="colab-figure">
  <img decoding="async" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3kAAAJOCAYAAAAK+M50AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAp1FJREFUeJzs3Xd809X+x/FX0kmhLS2klC7KngIyZDtQhsoSEVBUQFBEEe/FgXhV4DrwOnChqICtCnivCChLhqD+WGWLsmWUlpbSspoyOpPfH6HB2gIB0iZt38/H4zw03+9J+vm2H9J8es73HIPVarUiIiIiIiIiZYLR1QGIiIiIiIiI86jIExERERERKUNU5ImIiIiIiJQhKvJERERERETKEBV5IiIiIiIiZYiKPBERERERkTJERZ6IiIiIiEgZ4unqAEREREqT48ePc/z48SLP1a5dGy8vrwLHdu7cSVZWFi1atLjs66ampvLII4/wxRdfEBISck2xpaamEhgYiI+PzzU9X0REygYVeSIiUu4YDAaH+g0ePJjY2NgCx95//33effddAgMDCxw/duwYf/75J3Xq1CE+Pp7w8HC8vLyIiYnh+PHj9texWCycO3eu0Nc6fvw4ixcv5vjx4/j5+RU6X6FCBTw8PC4bb7169Zg+fTr9+vVz6PpERKRsUpEnIiLl0pdffkn79u0vef7ZZ5+95LkBAwYUKv7yC8fc3Fxq1qzJ7t27adCgQaHn7tq1ixtuuOGSr924ceMij69YsYI77rjjks8TERHJpyJPRETKpbCwMOrUqXPJ85UqVSqWr9ukSROsVmuh4/Hx8dSsWZNDhw4RHR1dLF9bRETKBxV5IiIiLnD27NkCxV7+FM5z585x5syZAn2Lq+AUEZGySUWeiIjIVfrhhx9o0qTJdb1GjRo1OHHiRKHjRU3XPH/+PL6+vg697n333Vfk8bS0NKpWrXp1QYqISKmkIk9ERMqlxMRE9uzZc8nzZrOZ4ODgQscff/xxevTowfTp0zl8+DCvvvqq/VxkZKRDXzsrK4sjR45cfdAO+OCDD+jatWuh40FBQcXy9URExP2oyBMRkXLpkUceuWKfwYMHFzoWERFBREQE8+bNIy8vj7Zt2xY4n5ube8XXrVGjBseOHXM8WCAnJwdPzyv/2g4LCytywRcRESk/tBm6iIiUSytWrMBqtV6yDRo06LLPP3nyJEuWLKFt27b2tmbNGoe//vz58+1fKz4+nszMTKxWK2fOnCExMdF+btOmTdd7qSIiUs6oyBMREbkGR44coV+/frz55pu8+eabHDp0qMj9764kNzeX6Ohodu7cCcDChQvp2LGjs8MVEZFyRNM1RURErsHvv//OP//5T2699VbAtsl5UZuYF2XBggX27RuOHz8OQEhISJF9mzVrRmJiokNTNUVEREBFnoiIyFXbsGEDZrPZvpm61WolPT0df39/PD09i9wH769uuukm+/9v3ryZqlWrEhERUWRfLy8vUlJSOHr0KK1bt3beRYiISJmlIk9ERMql5ORk9u/ff8nzZ86coXLlykWemzhxIgMGDMDf3x+A1NRUcnJyqFat2lXFkJWVxZtvvsnAgQMv22/hwoVs3LiRH3/8kZycHA4cOFBkP4vFQnJy8iVXDQ0NDb3kNYmISNmhIk9ERMqlolbOdKTP22+/zbp169i1axc///wzVapUYcGCBVSqVMle5G3atIndu3dTuXJlNmzYUGi1S6vVyi+//MLYsWM5ceIE33//vf2cp6cnp06dYu3atQQFBZGens78+fO57bbbAEhKSqJhw4aXjPnpp5++5LmPPvqIUaNGXfG6RUSkdFORJyIi5c6//vUvhg4dSu3atS/Z57vvvsNoLLg+2c6dOxk/fjxz5swhLCyMBx98kPXr11OhQgX+/e9/YzAYANsefM8//zwZGRn4+fnx/PPP21/j8OHDtGvXjuPHj/PQQw/x5ptvFtikvF27doSFhdG5c2dycnKoUKECdevWZcSIEQBER0dfcTqoiIiUbwarflOIiIg4LCUlhdDQ0Ot6jZUrV9K0aVNMJpOTohIREblIRZ6IiIiIiEgZon3yREREREREyhAVeSIiIiIiImWIijwREREREZEyREWeiIiIiIhIGaIiT0REREREpAzRPnkOsFgsJCcn4+/vb98DSUREREREpCRZrVYyMjIICwsrtJfrX6nIc0BycjKRkZGuDkNERERERITExEQiIiIueV5FngP8/f0B2zczICDAxdHYWCwW0tLSMJlMl63iRS5HeSTOolwSZ1AeibMol8QZ3DGPzGYzkZGR9vrkUlTkOSB/imZAQIBbFXmZmZkEBAS4TdJJ6aM8EmdRLokzKI/EWZRL4gzunEdXuoXMvaIVERERERGR66IiT0RE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O9fC899t5/vfkgF4tms9nrytjvbAExEREREppVTklWPmzBwe/3oL6w6cwNNo4M17m9KvZYSrwxIRERERkeugIq+cOpp+nqExm9iTkkFFbw+mPtiSm+uZXB2WiIiIiIhcJxV55dDelAyGxGzkaHomJn8fYoe2pnFYoKvDEhERERERJ1CRV86sP3CCx77eTEZmLnVCKhE7tDURQX6uDktERERERJxERV45smB7Ms9+u53sPAs3RQfz+cMtqezn7eqwRERERETEiVTklQNWq5Vpqw/yxpI9ANx1QyiT+zfH18vDxZGJiIiIiIizqcgr4/IsVl5dtIvYdfEAPNKhJi/d3RCjUVskiIiIiIiURSryyrDMnDz+8d/fWLozBYCX7m7I8E61XByViIiIiIgUJxV5ZdSps9k8+tVmNh8+hbeHkckDmtGjaZirwxIRERERkWKmIq8MSjx5jsExGzmYdpYAX0+mPdyKNrWquDosEREREREpASryypg/jqQzNHYTx89kEV65ArFDW1O3mr+rwxIRERERkRKiIq8M+WVvKk/M2sq57DwaVg8gdmhrqgX4ujosEREREREpQSryyohvNyUybv4f5FmsdKxTlakPtsDf18vVYYmIiIiISAkzuvKLWywW4uLieOaZZwgODiY2NrbA+aysLF544QXq1KlDWFgYvXv3Jjk5uUCfpKQkBgwYQHR0NOHh4YwZM4bs7OwCfeLi4ujUqRNRUVHUrVuXadOmFfelFas8i5W4gydYvuck6w8cZ/KKvTw/93fyLFb6tgjniyGtVeCJiIiIiJRTLi3yYmJiGD16NBUqVMDDo/DG3E8++SQbNmxgy5YtJCQkULduXe68807y8vIAyM7OpkuXLkRFRXHgwAF27tzJ1q1bGTNmjP019u7dS7du3fjnP/9JQkICCxYs4JVXXuG7774rset0pqU7jtLxP6t4YPpGXll6iEEzNvHhyv0APHlbbd69rxneni79sYqIiIiIiAu5tBoYNmwYGzdu5LXXXqNixYoFziUkJBATE8O7775LYGAgnp6evPHGGyQlJbFkyRIA5syZQ2pqKm+88QYeHh5UrlyZyZMnM336dI4fPw7AO++8wy233ELfvn0BaNiwIc899xyTJk0q2Yt1gqU7jjJy5laOpmcWef6G8EAMBm1yLiIiIiJSnrntkM+vv/5KtWrVaNGihf2Y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41tuuaXAqJyHhwd16tS55NdytDBKTEwkKSmJDh06FDj+7rvv8vHHH7Nt2zbCw8Mv+fwpU6YQERFBnz59GDRoED169GD16tX4+Pg49PVnzZrF8OHD6dGjBzExMcTGxpKVlcWUKVNYtGgREyZM4Ntvv2XBggUEBQXZn/f777/b75Xbu3cvvr6+nDx5knfeeYcHH3wQgCZNmjBlyhRuvfVWAO64444Co36enp7ExsYyYcIE8vLyMBgMRcbo5eVV4Hvfvn17atas6dD1iYhI8TBYrVarq4MQERHJl5WVxd9/NRmNRry9vQv1jY+Px9fXl9DQUPux2NhYXnrppQL3nf1dbm4uXl5e/Pzzz/YiB8BqtTJr1iz27t3L/v372blzJ3/88QdgG7W69957+eSTTzAajbRt2xY/Pz9++eUXPD2L/ptpixYt6NOnD6+88srVfAsAmDNnDg899BAzZ86kX79+AHTu3JlWrVrx1ltvAXDy5EluvvlmatSoweLFi+3PrV+/PllZWRw+fJiwsDA6depESkoKe/bssU91TUxMpGrVqlSoUAGA5ORkPvnkE4YMGcKZM2dYvnw5ffv2BeDIkSNERkYW+rnExsby1VdfsWrVqqu+PhERKT6arikiIm4lMDCQyMhIoqOjiY6OJjQ0lM6dOwOQnp5O27ZtOXPmDADPPvssU6ZMcdrXNhgMfPTRR2zbto26detiMBi47777OHjwIAsXLuSHH35g6tSpeHt787///Y/t27dfcsERi8XC7t27adGixVXHkZaWxvDhw/noo4/sBR7Azp07adiwof1xcHAw06dPZ8mSJaxbt85+fO/evcTHxwOwbNky/vvf/wLwzjvvsH//fvbv30/dunWZNWuW/XH79u3tz//zzz954oknePjhhwtMLf30009p3ry5vW3evNk+VXbJkiV8+eWXV32tIiLifCryRETE7axevdp+v92nn35qP56Tk8OGDRuuON0yNzeXPXv2XLLt3bv3ks/dsGEDixYt4uWXXyYxMZF+/fpRs2ZNbr75Zvr27cvKlSsBqFu3LuPGjeM///kPx44dK/Q6+/fvJzMzk6ZNmxY4bjabSUtLKzQq9ldTp04lMjKS4cOH248lJCSQmppKy5YtC/Rt27Yt4eHhLFu27LLfk6tx4403snnzZtauXcv06dPtx4cPH05cXJy9DRgwgNTUVABmzpxJQkKC02IQEZFrp3vyRETE7bz11lsEBwcDXLYgu5Rjx44VGPG6FsuXLyczM5O7777bfiw0NJTffvvN/nj06NG8//77vPLKK3z22WcFnv/nn3/i7e1NREQE8fHxvPvuu8yfP5+kpCTANmL5yCOP8Prrr9unTOZbsWIFvXv3LnAf3NKlS6latSpNmjQpFGtYWNgVt2gIDg7m2Wef5dlnn7UfGzhwYIE+f40jIiKCNWvWEBISwtGjRzEYDKxevZr777/f3ueTTz4hNTWVs2fPsmTJEsaNG3fZGEREpGRoJE9ERNyOyWQiNDSU0NBQAgMDr/r54eHhWK3WS7acnJwrvsbs2bPp1asXFStWtB/Lzs4ucG9gpUqVGDt2rH00668OHz5MZGQkb731Fo0aNeLcuXPMnj2bU6dOcfr0aWJiYvjyyy8ZOXJkoecmJycTFRVV4NjcuXO56667MBoL/+o+efIk/v7+l72eefPmFViRtKg2YMCAAs/J/35lZmbi4eFBVlYWbdu2JSUlhTp16lCtWjU8PDz44IMPMJlM3HDDDZeNQURESoZG8kRExO0MHTrUvoLmf//7X6fed+eIEydOMHfuXH744YdCx6tWrVrg2OjRoxkzZkyh10hISODAgQPMnDmTdevW0bx58wLn77nnHvbt28err75KbGxsgXOVKlUiLS3N/vjAgQOsWLGiyAVODh48yIEDBy5775/VaiUrK4sKFSoQEBBQaKXM7Oxs2rdvz08//VTg+AcffIDFYuHhhx/G19e30Ot6eHhQv359Xn/9df79739f8uuLiEjJ0kieiIi4nU6dOtlH8h5//PES//rTp08nIiKCLl26FDh+4MABateuXeCYl5dXkdsLtGjRgoceeoi1a9cWKvDynTlzpsiRyo4dO7JixQr74/Hjx9O8efMCK4GCrXj75z//SZUqVejdu3eRX2PSpEnUrl3bPnp54MABTp8+XaB98sknRT53/vz5REZGkpycfMkR1bZt22IwGBg2bFiR50VEpORpJE9ERNzOwoUL7fvczZ8/v0RXbTx//jyTJ0/mxRdfLDA1MjMzk82bNzNq1CiHXqd///7079//kud//vlnPvjgA/7xj38UOvfUU0/RrFkz3nvvPQwGA9988419wZd8SUlJjBo1ikWLFjFnzhz7tNIzZ87wwgsvsGjRImrVqkXDhg15++238fLyAqBp06aFpnyeO3eu0Ejg9u3b2b9/P/feey8LFiygevXqgO3ewPwtK06fPs3y5cuJioqicuXKjB8/nttvv52bb77Zoe+RiIgUDxV5IiLidipXrmyfFvnXe82qVq162VUp8+Xl5bF///7Lnr+Ud955B6vVyqOPPsqGDRv46quvGDlyJHPnzsVoNHLnnXdexZXY5ObmkpGRweHDh9m0aRNz585lxYoVjBgxgvHjxxfq36BBA6ZPn86wYcOwWq18+OGH3HrrraSmpvLdd9/x008/sWTJEoKCgvj+++/p2bOn/bmVKlWiVq1azJ07t8BKnJmZmYBto/S/TzmNjY1l5syZBY599NFHtGvXjvDwcNauXUuzZs1o3749O3fupHbt2mRnZ3PHHXfQq1cvFi9ezNy5c1mwYAFhYWEq8kREXExFnoiIuKXz58+zb98+kpKSCkyHTElJITExkdDQUFJSUmjUqFGh56akpFC3bt1r+rr79+/n5Zdfxs/Pj+rVq/Pnn3/SokULjEYjU6dOxc/P76pf84477uDXX3/FYDBQu3ZtunTpwubNm7nxxhsv+ZyHHnqInj17kpeXR5UqVQDbhuwzZsygSpUqfPDBBwwaNMi+uflfFXWPYL769esXml6alZVFmzZt7I+PHTvGzJkz+eKLLzh//jzLli1jypQpBAQEEBAQwLFjx+jbty+VKlXivffeo0WLFjz44INkZWXRvXv3q/32iIiIk6nIExERt5STk0OHDh3IzMzkySeftB/ft28fXbt2JSsrC29v70LL9jdr1oy33nqL55577pKvbbFYeOWVV6hRo0ahc3+dGhoVFcXy5cvJzc3FYrEUWFnzasyePZv09HSioqIKrNZ5JZUrVy7w2NfXly1btlxTDPn27t17xZG8o0ePUrNmTe677z62bNlChQoV6NOnj/38oEGDCAoKYs6cOXh4eDBkyBBWrlyJxWIp8nsqIiIly2B1ZN6LiIhICdm3bx/R0dFXLKgyMzPx9PTE01N/rywO586ds49aHjt2jGrVqtnPHTt2jCpVquh7LyLiplTkiYiIiIiIlCHaQkFERERERKQMUZEnIiIiIiJShqjIExERERERKUNU5ImIiIiIiJQhWhbLARaLheTkZPz9/QvtLSQiIiIiIlISrFYrGRkZhIWFYTReerxORZ4DkpOTiYyMdHUYIiIiIiIi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+OILDh065DMfquTyXCpL1apV48MPPyQjI4O+ffvStm1bT4NnjGHcuHHUrl2b+vXr2zkMsdmlclS9enVmzJhByZIlGT16NCVKlOBvf/sbBw4cANxLycPCwnzm1hx6Vy0ALpeLkiVL0rBhQz744AMAAgICAKhRowa33norp06dYuvWrQCeP3ZlypShZ8+ePPLII7qWSvKdoy1btgCQnp5OQkICU6ZMoXHjxpw5c4bvv/+esWPH2jYG8Q75zVLuNcHvv/8+HTp04PHHH6dmzZo4nU7eeOMNfTAv4vKTo99++429e/dyzz33cNddd5GYmMikSZMA99+648eP68sC+cufk/bu3UuzZs147LHHqFWrFtnZ2cyYMYNixbRArSi7VI7atGnD8ePH2bp1K40aNeKTTz7hl19+YeTIkdStW5fTp08zf/58z+qVwk5/oQtA7u5hcXFx7Nq1i23btuFwODyN2x133MGhQ4c83zYYYzzLNmNiYhg7dixBQUG21S/eIb85+uMXAkFBQSxZsoR58+Yxe/ZswsLC7CpfvEh+s5S7w1j9+vV57rnnqF69OgsXLmTu3LmUKlXKziGIF8hPjuLj40lKSiI2Npb58+cTHh6O0+n0/I3L3QVYira/+jkpMjKSiRMncv3117Nw4ULmz59PaGionUMQL5CfHP3888+kp6cD7r9t8+bN47333mPlypUsWLCA0qVL2zgCa6nJs0BCQgIrV65kz549njegXE6nE3Bv29qyZUvq1KnDxIkTAfe3C+np6ZQtW5bQ0FB2797tOTd3a3JtUV50WJWjnTt3AlCpUiUWLlzI+vXrad68ecEORmxlVZZydxiLjo6mR48eDBs2jCZNmhTsYMQ2VuVoz549nue5XC78/f31t62Isfo9KTQ0lI4dOzJ48GAaN25coGMR+1j9eRvcjWH58uWpXr16gY2joKjJu0KjRo0iJiaGWbNmER0dzbPPPsuxY8c8x3OvsXvppZeoX78+999/P9999x0TJkwAICQkhGPHjhEWFkbXrl3tGobYzMocde/e3fPY9ddfb8t4xD5XI0tS9Fytv21a4lv0WJmlbt262TQKsZs+b18Gm3b1LPScTqd55JFHTPfu3c2xY8eMMcZMmzbNNG3a1Gzbts1z3uzZs811111nbrvtNpOZmWmysrLMokWLTPny5U1sbKwZN26cqVq1qhky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KEe+x+ubPBEREREREck/r91dU0RERERERP46NXkiIiIiIiI+RE2eiIiIiIiID1GTJyIiIiIi4kPU5ImIiNjA6XTaXYKIiPgoNXkiIiJX4NVXX6V06dIX/bds2bJznte1a1cWLFhwzuOHDx+mQoUKBVG6iIj4KDV5IiIiVyAjI4P77ruPU6dOnfdf48aNyc7OPuc5a9eupWXLljZVLSIivkxNnoiISAFbtGgRN910E5GRkXaXIiIiPqiY3QWIiIgUNdOnT6dVq1b07NmT1atX5zlmjOH06dOULl2aqlWrsnPnTpuqFBGRwkpNnoiISAFas2YNX3/9Na1ateLTTz895/ipU6eoUKECp06dKvjiRETEJ2i5poiIyBWaNm3aBTdd2bBhg+e87OxsRowYQYsWLTyPrV27ljfffNOOskVExEepyRMREblCQ4YMueDGK3/cXGXdunU0bdqUDh06eB6rXbs2EyZMYP369XaULiIiPkhNnoiISAFp164dU6ZMyfNYZGQkr732Gg8++CBZWVk2VSYiIr5E1+SJiIgUoOLFi5/z2L333suhQ4fIycmxoSIREfE1avJERERs5nA4GDt2LIBm80RE5IppuaaIiMgVyu/GKxeTkJDAiRMnOHbsGA6H4ypXLCIivkwzeSIiIlfg4Ycf5oEHHqBSpUrnPf7f//6XiIiIS77OjBkz+Mc//kFaWlqe3TdFRET+KocxxthdhIiIiIiIiFhDyzVFRERERER8iJo8ERERERERH6ImT0RERERExIeoyRMREREREfEhavJERERERER8iJo8ERERERERH6ImT0RERERExIeoyRMREREREfEhavJERERERER8iJo8ERERERERH6ImT0RERERExIf8P1XveqlOmzQSAAAAAElFTkSuQmCC" alt="売上と前日差を示す折れ線グラフ">
  <figcaption>売上水準と前日からの増減を上下に分けて示したグラフ</figcaption>
</figure>
<p>上段では売上水準、下段では前日からの増減を確認できます。0より上なら増加、下なら減少です。グラフの色・線種・凡例などを整えたい場合は、<a href="https://pythondatalab.com/matplotlib-line-legend-color/">Matplotlib折れ線グラフの描き方</a>を参考にしてください。</p>
<h2 id="まとめ"><span id="toc25">まとめ</span></h2>

<p><code>diff()</code>を使うと、DataFrameやSeriesで前の行との差分を簡単に計算できます。</p>

<ul>
<li>標準の<code>diff()</code>は「現在行 − 1つ前の行」を計算する</li>
<li>正の値は増加、負の値は減少、0は変化なしを表す</li>
<li>先頭行の<code>NaN</code>は比較相手がないためで、エラーではない</li>
<li><code>periods</code>で比較する行を変更でき、<code>periods=2</code>は原則として2行前を意味する</li>
<li>時系列データは、日付型と並び順を確認してから計算する</li>
<li>日付が欠けている場合、前の行との差を前日差とは限らない</li>
<li>増減率には<code>pct_change()</code>、前の値には<code>shift()</code>、移動平均には<code>rolling()</code>を使う</li>
</ul>

<p>まずは、<strong>日付変換→日付順に並び替え→<code>diff()</code>で差分列を追加</strong>という順番を覚えましょう。これで日別売上やアクセス数について、前回からの増減を正しく確認できるようになります。</p>
<h2 id="関連記事"><span id="toc26">関連記事</span></h2>

<ul>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方・基本操作をわかりやすく解説</a></li>
<li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a></li>
<li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換とformat・NaT対処</a></li>
<li><a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門｜sort_values・sort_indexの違い</a></li>
<li><a href="https://pythondatalab.com/pandas-rolling/">pandas rolling()の使い方｜移動平均・window・NaNを解説</a></li>
<li><a href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方｜月別・週別に集計する方法</a></li>
<li><a href="https://pythondatalab.com/matplotlib-line-legend-color/">Matplotlib折れ線グラフの描き方</a></li>
<li><a href="https://pythondatalab.com/pandas-roadmap/">Pandasロードマップ</a></li>
</ul>

<p>仕様を確認したい場合は、<a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.diff.html" target="_blank">pandas公式ドキュメント：DataFrame.diff</a>も参考になります。</p>
<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc27"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p></div>
</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1787404742488" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">pandasで前の行との差を求めるにはどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p>対象のSeriesに<code>diff()</code>を使います。売上列なら<code>df["売上"].diff()</code>で、現在行から1つ前の行を引いた差分を求められます。</p>

</div>
</div>
<div id="faq-question-1787404769003" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">diff()の先頭行がNaNになるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>先頭行には比較する1つ前の行がないためです。計算エラーではなく、正常な結果です。</p>

</div>
</div>
<div id="faq-question-1787404779156" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">diff()で前日差や前日比率を計算できますか？</span></h3>
<div class="rank-math-answer ">

<p>日付が1日刻みで連続し、日付順に並んでいれば、<code>diff()</code>で前日からの増減量（前日差）を計算できます。割合としての前日比率には<code>pct_change()</code>を使います。</p>

</div>
</div>
<div id="faq-question-1787404792094" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">diff()のperiods=2は何を意味しますか？</span></h3>
<div class="rank-math-answer ">

<p>現在行と2行前の値との差を意味します。日付が連続している場合は2日前と一致しますが、日付に欠けがあれば2日前とは限りません。</p>

</div>
</div>
<div id="faq-question-1787404806166" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">diff()とshift()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>diff()</code>は前の行との引き算を行い、増減量を返します。<code>shift()</code>は値を指定行数だけずらし、前の行の値そのものを返します。</p>

</div>
</div>
<div id="faq-question-1787404814127" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc33">日付が連続していなくても前日差になりますか？</span></h3>
<div class="rank-math-answer ">

<p>なりません。<code>diff()</code>が比較するのは基本的に1つ前の行です。前日の行が存在しなければ、結果は前回観測値との差になります。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-diff/">pandas diff()の使い方｜前の行との差分・前日からの増減を計算する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-diff/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas rolling()の使い方｜移動平均・window・NaNを初心者向けに解説</title>
		<link>https://pythondatalab.com/pandas-rolling/</link>
					<comments>https://pythondatalab.com/pandas-rolling/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Wed, 19 Aug 2026 13:21:30 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2121</guid>

					<description><![CDATA[<p>日別売上やアクセス数を折れ線グラフにしても、値が大きく上下していると「増えているのか、単にばらついているだけなのか」が分かりにくいことがあります。 このようなときに使えるのが、pandasのrolling()です。直近の [&#8230;]</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-rolling/">pandas rolling()の使い方｜移動平均・window・NaNを初心者向けに解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<div class="colab-article">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
  .colab-article pre[class*="language-"] { margin: 0 !important; padding: 1em; }
  .colab-article .colab-table-wrap { overflow-x: auto; margin: 1em 0; }
  .colab-article table.wp-block-table { width: auto; border-collapse: collapse; }
  .colab-article table.wp-block-table th,
  .colab-article table.wp-block-table td { border: 1px solid #dcdcdc; }
  .colab-article .colab-figure img { max-width: 100%; height: auto; }
  .colab-article .colab-output { overflow-x: auto; white-space: pre-wrap; }
</style>


<p>日別売上やアクセス数を折れ線グラフにしても、値が大きく上下していると「増えているのか、単にばらついているだけなのか」が分かりにくいことがあります。</p>
<p>このようなときに使えるのが、pandasの<code>rolling()</code>です。<strong>直近の複数行を少しずつずらしながら平均を計算し、短期的な変動をならして傾向を見やすくできます。</strong></p>
<p>先に結論を示すと、<code>rolling(window=3).mean()</code>は、原則として<strong>現在行を含む直近3行の平均</strong>を求めます。データが1日1行で日付も連続していれば、「3日移動平均」として読めます。ただし、<code>window=3</code>自体が自動的に3日間を意味するわけではありません。</p>
<p>また、結果の先頭に出る<code>NaN</code>はエラーではありません。3行分のデータがまだそろっていないためです。</p>
<p><strong>最初に覚える手順は、「日付順に並べる → rolling()で計算する → 元の値と比べる」の3つだけです。</strong></p>
<p>この記事では、Google Colabで実行できる日別売上データを使い、3日・7日移動平均、<code>min_periods</code>、<code>resample()</code>との違い、折れ線グラフでの確認までを順番に解説します。</p>


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">rolling()は直近の複数行をずらしながら計算する</a></li><li><a href="#toc3" tabindex="0">rolling()・resample()・通常のmean()の違い</a></li><li><a href="#toc4" tabindex="0">日別売上のサンプルデータを用意する</a></li><li><a href="#toc5" tabindex="0">rolling()の前に日付型と並び順を確認する</a></li><li><a href="#toc6" tabindex="0">rolling(window=3).mean()で3日移動平均を計算する</a><ol><li><a href="#toc7" tabindex="0">window=3が対象にする値を処理前後表で確認する</a></li></ol></li><li><a href="#toc8" tabindex="0">先頭2行がNaNになる理由</a><ol><li><a href="#toc9" tabindex="0">min_periods=1で途中から計算する場合</a></li></ol></li><li><a href="#toc10" tabindex="0">center=Trueは結果を中央の行に置く</a></li><li><a href="#toc11" tabindex="0">3日移動平均と7日移動平均を使い分ける</a></li><li><a href="#toc12" tabindex="0">rolling().mean()とrolling().sum()の違い</a><ol><li><a href="#toc13" tabindex="0">rolling()の後ろで使える主な集計メソッド</a></li></ol></li><li><a href="#toc14" tabindex="0">元の売上と移動平均を折れ線グラフで比較する</a></li><li><a href="#toc15" tabindex="0">rolling(3)とrolling(&#8220;3D&#8221;)は対象範囲が違う</a></li><li><a href="#toc16" tabindex="0">rolling()でよくあるミスと注意点</a><ol><li><a href="#toc17" tabindex="0">window=3を必ず3日間だと思ってしまう</a></li><li><a href="#toc18" tabindex="0">日付順に並べず計算する</a></li><li><a href="#toc19" tabindex="0">先頭のNaNをエラーだと思う</a></li><li><a href="#toc20" tabindex="0">rolling()だけで元のDataFrameが変わると思う</a></li><li><a href="#toc21" tabindex="0">欠損値があっても同じように計算できると思う</a></li></ol></li><li><a href="#toc22" tabindex="0">データ分析の流れでrolling()を使う位置</a></li><li><a href="#toc23" tabindex="0">まとめ</a></li><li><a href="#toc24" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc25" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc26" tabindex="0">pandasのrolling()は何をするメソッドですか？</a></li><li><a href="#toc27" tabindex="0">rolling(3)の3は3日という意味ですか？</a></li><li><a href="#toc28" tabindex="0">rolling()の結果で最初の行がNaNになるのはなぜですか？</a></li><li><a href="#toc29" tabindex="0">min_periods=1を指定すればNaNを消してもよいですか？</a></li><li><a href="#toc30" tabindex="0">rolling()とresample()は何が違いますか？</a></li><li><a href="#toc31" tabindex="0">center=Trueはどんなときに使いますか？</a></li><li><a href="#toc32" tabindex="0">DataFrame全体にrolling()を使えますか？</a></li><li><a href="#toc33" tabindex="0">expanding()やewm()とは何が違いますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
  <li><code>rolling()</code>を使う場面と基本的な書き方</li>
  <li><code>rolling(window=3).mean()</code>のwindowが表す範囲</li>
  <li>3日移動平均と7日移動平均の計算方法</li>
  <li>先頭に<code>NaN</code>が出る理由と<code>min_periods</code>の役割</li>
  <li><code>rolling()</code>・<code>resample()</code>・通常の<code>mean()</code>の違い</li>
  <li><code>center=True</code>で結果を置く位置を変える方法</li>
  <li>行数指定と<code>rolling("3D")</code>による期間指定の違い</li>
  <li>元の値と移動平均を折れ線グラフで比較する方法</li>
</ul>
<p>この記事のゴールは、目的に合ったwindowを選び、移動平均列を作って、元の値と比較しながら傾向を説明できるようになることです。</p>

<h2><span id="toc2">rolling()は直近の複数行をずらしながら計算する</span></h2>
<p><code>rolling()</code>の「rolling window」は、日本語では「移動窓」と考えると分かりやすいでしょう。</p>
<p>たとえば<code>window=3</code>なら、対象範囲を次のように1行ずつ移動させます。</p>
<p>1. 1〜3行目を使って計算する 2. 2〜4行目を使って計算する 3. 3〜5行目を使って計算する</p>
<p>平均を求める場合の基本形は次のとおりです。</p>
<p><code>df["売上"].rolling(window=3).mean()</code></p>
<p>列を1つ選ぶとSeriesになるため、これは<strong>Seriesにrolling()を適用して平均を求める書き方</strong>です。複数の数値列を選んだDataFrameにもrolling()を使えますが、この記事では1列に絞って仕組みを確認します。</p>

<h2><span id="toc3">rolling()・resample()・通常のmean()の違い</span></h2>
<p>似て見える処理でも目的が異なります。最初に次の基準で選びましょう。</p>
<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">方法</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">目的</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">計算対象</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">行数の変化</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">使用場面</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">代表的な書き方</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>rolling()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近の値をならす・合計する</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">現在行を含む直近n行</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">原則として元と同じ</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均、直近7件の平均</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>s.rolling(3).mean()</code></td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>resample()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">時間単位を変えて再集計する</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">日・週・月などの期間</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">通常は変わる</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">日別データを月別合計にする</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>df.resample("MS").sum()</code></td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">通常の<code>mean()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">列全体の平均を1つ求める</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">列全体</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1つの値になる</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">全期間の平均売上を知る</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>s.mean()</code></td>
      </tr>
    </tbody>
  </table>
</div>
<p><strong>迷ったときは、出力後も1日ごとの行を残したいかで判断します。</strong> 1日ごとの行を残して傾向をならすなら<code>rolling()</code>、月別・週別などに行をまとめるなら<code>resample()</code>です。列全体を代表する平均値が1つだけ必要なら、通常の<code>mean()</code>を使います。</p>
<p>月別・週別集計は、<a href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方</a>で詳しく解説しています。</p>

<h2><span id="toc4">日別売上のサンプルデータを用意する</span></h2>
<p>Google Colabで次のコードを実行してください。2026年8月1日から14日まで、1日1行で日付が連続するデータです。</p>
<p>売上は日ごとに上下しますが、全体として少しずつ増える値にしています。このデータなら、移動平均によって短期的な上下がならされる様子を確認できます。</p>

<pre class="line-numbers"><code class="language-python">import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    "日付": [
        "2026-08-01", "2026-08-02", "2026-08-03", "2026-08-04",
        "2026-08-05", "2026-08-06", "2026-08-07", "2026-08-08",
        "2026-08-09", "2026-08-10", "2026-08-11", "2026-08-12",
        "2026-08-13", "2026-08-14"
    ],
    "売上": [100, 160, 120, 190, 150, 220, 180, 250, 210, 280, 230, 310, 270, 340]
})

df</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">220</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-07</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">180</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-08</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">250</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">8</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-09</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">210</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">9</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-10</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">280</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">10</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-11</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">230</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">11</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-12</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">310</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">12</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-13</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">270</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">13</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-14</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">340</td>
      </tr>
    </tbody>
  </table>
</div>

<p>自分のCSVをGoogle Colabへ読み込む手順は、<a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>を参照してください。DataFrame自体の基本操作を確認したい場合は、<a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>が役立ちます。</p>

<h2><span id="toc5">rolling()の前に日付型と並び順を確認する</span></h2>
<p>移動平均は「直前の行」を使うため、行の順番が重要です。日付が文字列のままならdatetime型に変換し、古い日付から新しい日付の順へ並べます。</p>
<p>今回は日付が連続する1日1行のデータなので、<code>window=3</code>を3日移動平均として説明できます。欠損日があるデータでは、同じコードは「直近3日」ではなく<strong>直近3行</strong>の平均です。</p>

<pre class="line-numbers"><code class="language-python">df["日付"] = pd.to_datetime(df["日付"])
df = df.sort_values("日付").reset_index(drop=True)

df.dtypes</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">datetime64[ns]</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">int64</td>
      </tr>
    </tbody>
  </table>
</div>

<p><code>日付</code>が<code>datetime64[ns]</code>になっていれば変換できています。</p>
<ul>
  <li>日付変換の詳しい方法：<a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方</a></li>
  <li>並び替えの詳しい方法：<a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門</a></li>
  <li>日付をインデックスにする方法：<a href="https://pythondatalab.com/pandas-set-index/">pandas set_index()の使い方</a></li>
</ul>

<h2><span id="toc6">rolling(window=3).mean()で3日移動平均を計算する</span></h2>
<p>売上列に<code>rolling(window=3).mean()</code>を適用し、結果を「3日移動平均」という新しい列へ追加します。</p>

<pre class="line-numbers"><code class="language-python">df["3日移動平均"] = df["売上"].rolling(window=3).mean()

df[["日付", "売上", "3日移動平均"]]</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">220</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">186.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-07</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">180</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">183.33</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-08</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">250</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">216.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">8</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-09</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">210</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">213.33</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">9</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-10</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">280</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">246.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">10</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-11</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">230</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">240.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">11</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-12</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">310</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">273.33</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">12</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-13</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">270</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">270.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">13</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-14</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">340</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">306.67</td>
      </tr>
    </tbody>
  </table>
</div>

<h3><span id="toc7">window=3が対象にする値を処理前後表で確認する</span></h3>
<p>最初の5行は次のように計算されます。</p>
<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">元の売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">平均対象となる値</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">3行未満</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">3行未満</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100・160・120</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160・120・190</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120・190・150</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
      </tr>
    </tbody>
  </table>
</div>
<p>8月3日の値は、<code>(100 + 160 + 120) ÷ 3 = 126.67</code>です。次の行では対象が1行ずれ、8月2日〜4日の売上を平均します。</p>
<p>この表で重要なのは、<strong>各行の結果が、その行と直前2行から作られていること</strong>です。移動平均は元の行数を保ちながら各行に対応する平均を返し、列全体の平均を1つだけ返す<code>df["売上"].mean()</code>とは異なります。</p>

<h2><span id="toc8">先頭2行がNaNになる理由</span></h2>
<p>初期設定では、windowに指定した数の有効な値がそろうまで結果を計算しません。<code>window=3</code>の場合は次の状態になります。</p>
<ul>
  <li>1行目：利用できる値が1個だけなのでNaN</li>
  <li>2行目：利用できる値が2個だけなのでNaN</li>
  <li>3行目：3個そろうので移動平均を計算</li>
</ul>
<p>したがって、先頭のNaNはエラーではなく、<strong>同じ条件の3行平均をまだ計算できない</strong>ことを示す正常な結果です。単純に<code>fillna(0)</code>で0へ置き換えると、「平均売上が0だった」と誤解されるので避けましょう。</p>

<h3><span id="toc9">min_periods=1で途中から計算する場合</span></h3>
<p><code>min_periods</code>は、結果を計算するために最低限必要な有効値の数です。<code>min_periods=1</code>を指定すると、最初の行から結果が出ます。</p>

<pre class="line-numbers"><code class="language-python">df["3日移動平均_min1"] = (
    df["売上"]
    .rolling(window=3, min_periods=1)
    .mean()
)

df[["日付", "売上", "3日移動平均", "3日移動平均_min1"]].head(5)</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均_min1</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">130.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
      </tr>
    </tbody>
  </table>
</div>

<p>初期設定と<code>min_periods=1</code>の違いを整理します。</p>
<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">利用できる値の数</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">初期設定の結果</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">min_periods=1</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">比較時の注意点</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.00</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1個だけの平均</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">130.00</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2個の平均</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">3個の平均</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>min_periods=1</code>はNaNを減らせますが、先頭の値は3個ではなく1個または2個の平均です。すべての行を同じ条件で比較したい場合は、初期設定のNaNを残すほうが分かりやすいことがあります。</p>

<h2><span id="toc10">center=Trueは結果を中央の行に置く</span></h2>
<p>初期設定の<code>center=False</code>では、計算結果をwindowの末尾、つまり現在行に置きます。<code>center=True</code>を指定すると、結果をwindowの中央に置きます。</p>
<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">指定</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3行の計算結果を置く位置</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">向いている場面</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>center=False</code>（初期設定）</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">3行目（末尾）</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">現在までの値から傾向を確認する</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>center=True</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2行目（中央）</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">前後の値を使って中央時点をならす</td>
      </tr>
    </tbody>
  </table>
</div>
<p>同じ3つの値を平均しても、結果が表示される行が変わります。</p>

<pre class="line-numbers"><code class="language-python">center比較 = pd.DataFrame({
    "日付": df["日付"],
    "売上": df["売上"],
    "center=False": df["売上"].rolling(window=3).mean(),
    "center=True": df["売上"].rolling(window=3, center=True).mean()
})

center比較.head(6)</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">center=False</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">center=True</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">186.67</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">220</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">186.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">183.33</td>
      </tr>
    </tbody>
  </table>
</div>

<p>たとえば100・160・120の平均126.67は、初期設定では3行目の8月3日、<code>center=True</code>では中央に当たる2行目の8月2日に表示されます。</p>
<p>この記事の移動平均は「現在までの直近値から傾向を見る」ことが目的なので、以降は初期設定の<code>center=False</code>を使います。</p>

<h2><span id="toc11">3日移動平均と7日移動平均を使い分ける</span></h2>
<p>次に、同じ売上データへ7行の移動平均も追加します。サンプルは1日1行で日付が連続しているため、ここでは7日移動平均として扱えます。</p>

<pre class="line-numbers"><code class="language-python">df["7日移動平均"] = df["売上"].rolling(window=7).mean()

df[["日付", "売上", "3日移動平均", "7日移動平均"]]</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">7日移動平均</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">220</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">186.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-07</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">180</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">183.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-08</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">250</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">216.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">181.43</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">8</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-09</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">210</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">213.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">188.57</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">9</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-10</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">280</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">246.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">211.43</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">10</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-11</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">230</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">240.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">217.14</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">11</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-12</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">310</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">273.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">240.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">12</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-13</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">270</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">270.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">247.14</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">13</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-14</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">340</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">306.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">270.0</td>
      </tr>
    </tbody>
  </table>
</div>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">比較項目</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">window=3</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">window=7</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">使うデータ数</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近3行</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近7行</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">滑らかさ</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">小さい</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">大きい</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">急な変化への反応</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">比較的速い</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">比較的遅い</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">向いている目的</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">短期的な動きの確認</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">やや長い傾向の確認</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">先頭のNaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2行</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">6行</td>
      </tr>
    </tbody>
  </table>
</div>
<p>windowを大きくすると線は滑らかになりますが、急な上昇や下降が遅れて表れます。3日と7日のどちらが常に優れているわけではなく、<strong>どの程度の短期変動をならしたいか</strong>で選びます。</p>
<p>なお、移動平均は過去の値をならして見せる方法であり、将来を予測する機能ではありません。</p>

<h2><span id="toc12">rolling().mean()とrolling().sum()の違い</span></h2>
<p><code>rolling()</code>の後ろには、目的に合った集計メソッドを続けます。</p>
<ul>
  <li><code>mean()</code>：直近の平均を求め、変動をならす</li>
  <li><code>sum()</code>：直近の合計を求める</li>
</ul>
<p>たとえば「直近3日間の売上合計」を求める場合は、<code>sum()</code>を使います。</p>

<pre class="line-numbers"><code class="language-python">df["直近3日売上合計"] = df["売上"].rolling(window=3).sum()

df[["日付", "売上", "3日移動平均", "直近3日売上合計"]].head(7)</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">3日移動平均</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">直近3日売上合計</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">380.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">470.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">150</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">153.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">460.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">220</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">186.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">560.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-07</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">180</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">183.33</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">550.0</td>
      </tr>
    </tbody>
  </table>
</div>

<p>同じwindowでも、<code>mean()</code>は傾向をならす用途、<code>sum()</code>は直近期間の累計を確認する用途に向いています。</p>

<h3><span id="toc13">rolling()の後ろで使える主な集計メソッド</span></h3>
<p>rolling()は対象範囲を決める処理です。その後ろに、目的に合った集計メソッドを続けます。</p>
<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">メソッド</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">求める値</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">使用例</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>mean()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">平均</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">売上の短期変動をならす</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>sum()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">合計</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近3日分の売上合計を求める</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>min()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">最小値</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近期間の最低売上を確認する</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>max()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">最大値</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近期間の最高売上を確認する</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>median()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">中央値</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">極端な値の影響を抑えて中心を見る</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>std()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">標準偏差</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">直近期間のばらつきを確認する</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>count()</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">有効値の個数</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">window内のデータ数を確認する</td>
      </tr>
    </tbody>
  </table>
</div>
<p>初心者は、まず<code>mean()</code>と<code>sum()</code>を使い分けられれば十分です。ほかのメソッドも書き方は同じで、必要になったときに選べます。</p>

<h2><span id="toc14">元の売上と移動平均を折れ線グラフで比較する</span></h2>
<p>数値表だけでなく、元の売上、3日移動平均、7日移動平均を同じグラフへ描くと、windowによる滑らかさの違いが分かります。</p>
<p>ここではグラフの装飾ではなく、<strong>元の値の上下が移動平均でどのようにならされるか</strong>に注目してください。</p>

<pre class="line-numbers"><code class="language-python">plt.figure(figsize=(10, 5))
plt.plot(df["日付"], df["売上"], marker="o", alpha=0.55, label="Daily sales")
plt.plot(df["日付"], df["3日移動平均"], linewidth=2.5, label="3-row moving average")
plt.plot(df["日付"], df["7日移動平均"], linewidth=2.5, label="7-row moving average")

plt.xlabel("Date")
plt.ylabel("Sales")
plt.title("Daily sales and moving averages")
plt.grid(alpha=0.3)
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()</code></pre>

<figure class="colab-figure">
  <img decoding="async" src="images/figure1.png" alt="日別売上と3日移動平均・7日移動平均を比較した折れ線グラフ">
  <figcaption>日別売上と3日移動平均・7日移動平均の比較</figcaption>
</figure>

<p>3日移動平均は元の売上の変化に比較的早く反応し、7日移動平均はさらに滑らかになります。一方で、windowが大きいほど直近の変化が遅れて見える点には注意が必要です。</p>
<p>グラフの色・線種・凡例などを詳しく設定したい場合は、<a href="https://pythondatalab.com/matplotlib-line-legend-color/">Matplotlib折れ線グラフの描き方</a>を参照してください。</p>

<h2><span id="toc15">rolling(3)とrolling(&#8220;3D&#8221;)は対象範囲が違う</span></h2>
<p>ここまで使った<code>rolling(3)</code>は直近3行を対象にします。一方、日付をインデックスにした時系列データでは、<code>rolling("3D")</code>のように実際の期間を指定できます。</p>
<p>違いが分かるように、8月3日と4日が欠けたデータで比較します。</p>

<pre class="line-numbers"><code class="language-python">df_gap = pd.DataFrame({
    "日付": pd.to_datetime(["2026-08-01", "2026-08-02", "2026-08-05", "2026-08-06"]),
    "売上": [100, 160, 120, 190]
}).set_index("日付")

df_gap["直近3行平均"] = df_gap["売上"].rolling(3).mean()
df_gap["直近3日平均"] = df_gap["売上"].rolling("3D").mean()

df_gap</code></pre>

<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">直近3行平均</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">直近3日平均</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">100.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">160.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">130.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">126.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">120.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">190.0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">156.67</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">155.0</td>
      </tr>
    </tbody>
  </table>
</div>

<p>8月5日の「直近3行平均」は8月1日・2日・5日の3行を使います。一方、「直近3日平均」は実際の日付間隔を見るため、8月5日時点の直近3日内にある値だけが対象です。</p>
<div class="colab-table-wrap">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">書き方</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">windowの基準</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">欠損日がある場合</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>rolling(3)</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">行数</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">日付が離れていても直近3行を使う</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>rolling("3D")</code></td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">実際の3日間</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">その期間内にある行だけを使う</td>
      </tr>
    </tbody>
  </table>
</div>
<p>1日1行で日付が連続していれば両者は似た結果になりますが、欠損日や不規則な時刻があるデータでは一致しません。期間指定にはDatetimeIndexが必要です。この記事の中心は行数ベースの移動平均なので、期間指定はこの違いだけ押さえれば十分です。</p>

<h2><span id="toc16">rolling()でよくあるミスと注意点</span></h2>
<h3><span id="toc17">window=3を必ず3日間だと思ってしまう</span></h3>
<p>数値の<code>window=3</code>は基本的に3行です。1日に複数行がある場合や、日付が抜けている場合は3日間と一致しません。期間ベースでは<code>rolling("7D")</code>のような指定もできますが、日付インデックスなどの前提が増えるため、この記事では詳しく扱いません。</p>
<h3><span id="toc18">日付順に並べず計算する</span></h3>
<p>rolling()は現在の行順を使います。日付が前後したままでは、時間の流れに沿った移動平均になりません。先にdatetime型へ変換し、<code>sort_values()</code>で並べ替えましょう。</p>
<h3><span id="toc19">先頭のNaNをエラーだと思う</span></h3>
<p>必要な値がwindowの数に達していないためです。0埋めで隠すのではなく、NaNが生じる理由を確認します。</p>
<h3><span id="toc20">rolling()だけで元のDataFrameが変わると思う</span></h3>
<p>rolling()の計算結果は自動的に元のDataFrameへ追加されません。残したい場合は、この記事の例のように新しい列へ代入します。列追加の基本は、<a href="https://pythondatalab.com/pandas-add-column/">pandasで新しい列を追加する方法</a>で確認できます。</p>
<h3><span id="toc21">欠損値があっても同じように計算できると思う</span></h3>
<p>元データに欠損値があると、window内の有効値の数と<code>min_periods</code>によって結果が変わります。まず欠損の場所と意味を確認し、必要な件数を満たしているか判断してください。</p>

<h2><span id="toc22">データ分析の流れでrolling()を使う位置</span></h2>
<p>rolling()は、データを読み込んだ直後ではなく、日付や並び順を整えた後に使います。</p>
<p>1. CSVやExcelを読み込む 2. <code>head()</code>や<code>dtypes</code>で内容と型を確認する 3. 日付列を<code>to_datetime()</code>で変換する 4. 日付順に並べ替える 5. 必要に応じて<code>resample()</code>で時間単位を整える 6. <code>rolling()</code>で短期変動をならす 7. 折れ線グラフで元の値と比較する</p>
<p>年・月・曜日を取り出して別の切り口で集計したい場合は、<a href="https://pythondatalab.com/pandas-dt/">pandas dtの使い方</a>へ進んでください。</p>
<p>発展的な機能には、開始行から対象範囲を広げる<code>expanding()</code>、新しい値へ大きな重みを付ける<code>ewm()</code>、グループ別に計算する<code>groupby().rolling()</code>などがあります。<code>center=True</code>による結果位置の変更や欠損日の補間も含め、これらは基本を理解してから学べば十分です。</p>

<h2><span id="toc23">まとめ</span></h2>
<ul>
  <li><code>rolling()</code>は、直近の複数行を1行ずつずらしながら計算する</li>
  <li><code>rolling(window=3).mean()</code>は、原則として現在行を含む直近3行の平均を求める</li>
  <li>数値のwindowは基本的に行数であり、自動的に日数を意味するわけではない</li>
  <li>3行そろう前のNaNはエラーではなく、同じ条件で計算できないことを示す</li>
  <li><code>min_periods=1</code>なら先頭から計算できるが、利用する値の数が行ごとに異なる</li>
  <li><code>center=True</code>を指定すると、計算結果をwindowの中央に置ける</li>
  <li><code>rolling(3)</code>は直近3行、<code>rolling("3D")</code>は実際の直近3日間を対象にする</li>
  <li>window=3は変化へ比較的早く反応し、window=7は滑らかだが反応が遅くなる</li>
  <li>傾向を見るなら<code>mean()</code>、直近の合計を見るなら<code>sum()</code>を使う</li>
  <li>集計単位を変える<code>resample()</code>と、値をならす<code>rolling()</code>は目的が異なる</li>
  <li>計算前に日付型と並び順を確認し、計算後は元の値とグラフで比較する</li>
</ul>
<p>まずはこの記事のサンプルで3日移動平均を実行し、windowを7へ変えたときに結果がどのように変化するか確認してみてください。</p>

<h2><span id="toc24">次に読みたい関連記事</span></h2>
<ul>
  <li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a></li>
  <li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方・基本操作をわかりやすく解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換とformat・NaT対処</a></li>
  <li><a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門｜sort_values・sort_indexの違い</a></li>
  <li><a href="https://pythondatalab.com/pandas-set-index/">pandas set_index()の使い方｜列をインデックスにする方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-dt/">pandas dtの使い方｜日付から年・月・曜日を取り出す方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方｜日付データを月別・週別に集計</a></li>
  <li><a href="https://pythondatalab.com/pandas-add-column/">pandasで新しい列を追加する方法</a></li>
  <li><a href="https://pythondatalab.com/matplotlib-line-legend-color/">Matplotlib折れ線グラフの描き方</a></li>
</ul>


<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc25"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p></div>
</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1787145577821" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">pandasのrolling()は何をするメソッドですか？</span></h3>
<div class="rank-math-answer ">

<p>現在行を含む直近の複数行を対象に、平均・合計などを繰り返し計算するメソッドです。日別売上の短期的な変動をならし、傾向を見やすくする場面などで使います。</p>

</div>
</div>
<div id="faq-question-1787145589543" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">rolling(3)の3は3日という意味ですか？</span></h3>
<div class="rank-math-answer ">

<p>基本的には3行という意味です。データが1日1行で日付も連続している場合に限り、3日移動平均として読めます。実際の期間を基準にする方法には<code>rolling("3D")</code>などがありますが、日付インデックスなどの前提が必要です。</p>

</div>
</div>
<div id="faq-question-1787145600876" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">rolling()の結果で最初の行がNaNになるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>windowで指定した数の有効な値がまだそろっていないためです。<code>window=3</code>の初期設定では、最初の2行がNaNになり、3行目から結果が出ます。</p>

</div>
</div>
<div id="faq-question-1787145615895" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">min_periods=1を指定すればNaNを消してもよいですか？</span></h3>
<div class="rank-math-answer ">

<p>目的によります。先頭から値を表示できますが、最初は1個、次は2個、その後は3個の平均となり、計算条件がそろいません。元データに欠損値がある場合も、有効値の数が<code>min_periods</code>以上かで結果が決まるため、NaNを消す前に利用件数を確認してください。</p>

</div>
</div>
<div id="faq-question-1787145626826" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">rolling()とresample()は何が違いますか？</span></h3>
<div class="rank-math-answer ">

<p>rolling()は直近数行をずらしながら計算し、原則として元の行数を保ちます。resample()は日別を月別にするように時間単位を変えて再集計するため、通常は行数も変わります。1日ごとの行を残すか、期間ごとにまとめるかで判断してください。</p>

</div>
</div>
<div id="faq-question-1787145638388" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">center=Trueはどんなときに使いますか？</span></h3>
<div class="rank-math-answer ">

<p>計算結果をwindowの中央に置きたいときに使います。過去から現在までの傾向を見る通常の移動平均では初期設定のまま、前後の値で中央時点をならしたい場合は<code>center=True</code>が候補です。</p>

</div>
</div>
<div id="faq-question-1787145648723" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">DataFrame全体にrolling()を使えますか？</span></h3>
<div class="rank-math-answer ">

<p>使えます。複数の数値列を持つDataFrameに適用すると、各数値列へ同じwindowの計算が行われます。ただし、初心者は分析対象の列を選んでから適用すると、結果を理解しやすくなります。</p>

</div>
</div>
<div id="faq-question-1787145654142" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc33">expanding()やewm()とは何が違いますか？</span></h3>
<div class="rank-math-answer ">

<p><code>expanding()</code>は開始点から現在行まで計算範囲を広げます。<code>ewm()</code>は一般に新しい値へ大きな重みを付けて計算します。まずは一定数の直近行を扱うrolling()から覚えると分かりやすいでしょう。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-rolling/">pandas rolling()の使い方｜移動平均・window・NaNを初心者向けに解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-rolling/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas resample()の使い方｜日付データを月別・週別に集計する方法</title>
		<link>https://pythondatalab.com/pandas-resample/</link>
					<comments>https://pythondatalab.com/pandas-resample/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 31 May 2026 13:12:33 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2082</guid>

					<description><![CDATA[<p>pandasのresample()で日付データを月別・週別・日別に集計する方法を初心者向けに解説。to_datetime()で日付型に変換し、set_index()やon引数を使って売上合計・件数・平均を集計する流れ、groupby()やasfreq()との違いも紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方｜日付データを月別・週別に集計する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<div class="colab-article">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">

<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>

<style>
  .colab-article pre[class*="language-"],
  .colab-article pre.line-numbers {
    margin: 0 !important;
    padding: 1em;
  }

  .colab-article pre.colab-output,
  .colab-article pre.colab-error {
    margin: 0 !important;
    padding: 0.8em 1em;
    overflow-x: auto;
    white-space: pre;
    background: #f7f7f7;
    border: 1px solid #d9d9d9;
  }

  .colab-article figure.wp-block-table {
    margin: 0.8em 0;
    overflow-x: auto;
  }

  .colab-article table.wp-block-table,
  .colab-article figure.wp-block-table table {
    width: auto;
    border-collapse: collapse;
  }

  .colab-article .colab-figure {
    margin: 1em 0;
  }

  .colab-article .colab-figure img {
    max-width: 100%;
    height: auto;
  }
</style>


<p>CSVやExcelを読み込んだあと、注文日・来店日・売上日などの日付列はあるのに、次のような集計で迷うことがあります。</p>
<ul>
<li>月ごとの売上合計を出したい</li>
<li>週ごとの注文件数を数えたい</li>
<li>日別の平均売上を確認したい</li>
<li>集計した結果を折れ線グラフで見たい</li>
</ul>
<p>このようなときに役立つのが、pandasの <code>resample()</code> です。</p>
<p><code>resample()</code> は、日付データを日別・週別・月別などの時間単位でまとめて集計するためのメソッドです。</p>
<p>イメージとしては、1行ずつ並んでいる日付データを「1日ごと」「1週間ごと」「1か月ごと」の箱に分け、その箱ごとに合計・平均・件数を計算する処理です。</p>
<p>たとえば、1件ずつ並んでいる注文データから、月別売上や週別件数を作りたいときに使います。</p>
<p>この記事では、<code>to_datetime()</code> で日付列を整えるところから、<code>resample()</code> で月別・週別・日別に集計し、最後にグラフ化へつなげる流れまで、Google Colabで試しやすいサンプルデータを使って解説します。</p>



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-7" checked><label class="toc-title" for="toc-checkbox-7">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">関連する前提知識</a></li><li><a href="#toc3" tabindex="0">まず結論：resample()は日付を時間単位でまとめるときに使う</a></li><li><a href="#toc4" tabindex="0">サンプルデータを用意する</a></li><li><a href="#toc5" tabindex="0">resample()を使う前に日付列をdatetime型にする</a></li><li><a href="#toc6" tabindex="0">方法1：日付列をインデックスにしてresample()する</a></li><li><a href="#toc7" tabindex="0">月別売上を集計する：resample(&#8220;MS&#8221;).sum()</a><ol><li><a href="#toc8" tabindex="0">出力例で見る：MS・ME・Mの違い</a></li></ol></li><li><a href="#toc9" tabindex="0">頻度指定の基本：D・W・MS・MEを使い分ける</a></li><li><a href="#toc10" tabindex="0">複数の集計をまとめて出す</a></li><li><a href="#toc11" tabindex="0">週別件数を集計する：resample(&#8220;W&#8221;).count()</a></li><li><a href="#toc12" tabindex="0">日別平均を集計する：resample(&#8220;D&#8221;).mean()</a></li><li><a href="#toc13" tabindex="0">方法2：on引数で日付列を指定してresample()する</a></li><li><a href="#toc14" tabindex="0">groupby()・dt・resample()の違い</a></li><li><a href="#toc15" tabindex="0">比較用：dtで年月列を作ってgroupby()する方法</a></li><li><a href="#toc16" tabindex="0">補足：resample()とasfreq()の違い</a></li><li><a href="#toc17" tabindex="0">集計結果をreset_index()で通常の表に戻す</a></li><li><a href="#toc18" tabindex="0">集計結果をグラフで確認する</a></li><li><a href="#toc19" tabindex="0">よくあるミスと確認ポイント</a><ol><li><a href="#toc20" tabindex="0">日付列がobject型のままになっている</a></li><li><a href="#toc21" tabindex="0">DatetimeIndexまたはonで指定した日付列が必要</a></li><li><a href="#toc22" tabindex="0">売上合計・平均・件数を混同しない</a></li><li><a href="#toc23" tabindex="0">月だけでgroupbyすると年をまたいだときに混ざる</a></li><li><a href="#toc24" tabindex="0">欠損期間が出ることがある</a></li></ol></li><li><a href="#toc25" tabindex="0">resample()はデータ分析の流れのどこで使うか</a></li><li><a href="#toc26" tabindex="0">まとめ</a></li><li><a href="#toc27" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc28" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc29" tabindex="0">resample()とgroupby()の違いは何ですか？</a></li><li><a href="#toc30" tabindex="0">resample()とasfreq()の違いは何ですか？</a></li><li><a href="#toc31" tabindex="0">resample()を使うには必ずset_index()が必要ですか？</a></li><li><a href="#toc32" tabindex="0">日付列がobject型のままだとresample()できますか？</a></li><li><a href="#toc33" tabindex="0">月別集計はresample()とdt.month＋groupby()のどちらがよいですか？</a></li><li><a href="#toc34" tabindex="0">resample(&#8220;M&#8221;)・resample(&#8220;ME&#8221;)・resample(&#8220;MS&#8221;)の違いは何ですか？</a></li><li><a href="#toc35" tabindex="0">resample()した後に普通の列に戻すにはどうすればよいですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<p>この記事では、次の内容を学びます。</p>
<ul>
<li><code>resample()</code> が何をするメソッドか</li>
<li><code>resample()</code> を使う前に日付列を <code>datetime</code> 型にする理由</li>
<li><code>set_index()</code> してから <code>resample()</code> する基本</li>
<li><code>on="日付列"</code> で日付列を指定して集計する方法</li>
<li>日別・週別・月別に集計する方法</li>
<li><code>sum()</code>、<code>mean()</code>、<code>count()</code> の使い分け</li>
<li><code>groupby()</code>・<code>dt</code>・<code>resample()</code> の違い</li>
<li><code>resample()</code> と <code>asfreq()</code> の違い</li>
<li>集計結果を <code>reset_index()</code> で扱いやすい表に戻す方法</li>
<li>集計結果をグラフ化へつなげる流れ</li>
</ul>
<p>この記事のゴールは、<strong>日付列をdatetime型に整え、resample()で日別・週別・月別に集計し、集計結果を表やグラフで確認できるようになること</strong>です。</p>


<h2><span id="toc2">関連する前提知識</span></h2>
<p>この記事は、日付データを「時間のまとまり」で集計する記事です。</p>
<p>先に次の内容を確認しておくと、より理解しやすくなります。</p>
<ul>
<li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜Drive連携とpandas read_csvを初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換と format・NaT 対処を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-dt/">pandas dtの使い方｜日付から年・月・曜日を取り出す方法を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-set-index/">pandas set_index()の使い方｜列をインデックスにする・drop=False・index_col・reset_indexとの違いを解説</a></li>
<li><a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas groupby×aggの使い方｜基本の集計とaggの書き方を例で解説</a></li>
</ul>
<p>ただし、この記事では必要な部分を順番に確認するため、最初から読んでも進められるようにしています。</p>


<h2><span id="toc3">まず結論：resample()は日付を時間単位でまとめるときに使う</span></h2>
<p><code>resample()</code> は、日付データを一定の時間単位でまとめるために使います。</p>
<p>たとえば、次のような明細データがあるとします。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">カテゴリ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1200</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">600</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2600</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1800</td>
</tr>
</tbody>
</table></figure>
<p>このような1件ずつのデータを、次のように月別にまとめたいときに <code>resample()</code> が役立ちます。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">年月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">売上合計</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
</tr>
</tbody>
</table></figure>
<p>ポイントは、<code>resample()</code> が「カテゴリごと」ではなく、<strong>日付を基準にして、日別・週別・月別などの時間のまとまりで集計する</strong>ことです。</p>
<p>最初に判断基準を整理すると、次のようになります。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">使うもの</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日付を月別・週別・日別にまとめたい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>resample()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別売上、週別件数</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">カテゴリや店舗ごとにまとめたい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>groupby()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">カテゴリ別売上、店舗別平均</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日付から年・月・曜日を取り出したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>dt</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">年列、月列、曜日列を追加</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">文字列の日付を日付型に変換したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>to_datetime()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"2026-01-05"</code> をdatetime型にする</td>
</tr>
</tbody>
</table></figure>
<p>この記事では、このうち <code>resample()</code> を中心に扱います。</p>


<h2><span id="toc4">サンプルデータを用意する</span></h2>
<p>ここでは、注文日・カテゴリ・商品・売上・数量を持つ小さな売上データを使います。</p>
<p>実際のCSVでは日付順に並んでいるとは限らないため、サンプルデータもあえて少し日付順をばらしています。</p>


<pre class="line-numbers"><code class="language-python">import pandas as pd

df = pd.DataFrame({
    "注文日": [
        "2026-03-15", "2026-01-05", "2026-02-03", "2026-01-18",
        "2026-03-28", "2026-02-25", "2026-01-28", "2026-02-12",
        "2026-03-02", "2026-01-12", "2026-02-05", "2026-03-05"
    ],
    "カテゴリ": [
        "食品", "食品", "日用品", "食品",
        "日用品", "食品", "日用品", "日用品",
        "食品", "日用品", "食品", "食品"
    ],
    "商品": [
        "コーヒー", "パン", "洗剤", "お茶",
        "ティッシュ", "お米", "歯ブラシ", "シャンプー",
        "牛乳", "ノート", "卵", "ヨーグルト"
    ],
    "売上": [1800, 1200, 2600, 1500, 900, 4200, 700, 3200, 1100, 600, 980, 1300],
    "数量": [3, 2, 1, 3, 2, 1, 2, 1, 2, 3, 2, 2]
})

display(df)
print(df.dtypes)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">カテゴリ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">数量</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">コーヒー</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1800</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">パン</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">洗剤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2600</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-18</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">お茶</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1500</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ティッシュ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">900</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-25</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">お米</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">歯ブラシ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">700</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">シャンプー</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">牛乳</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">9</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ノート</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">600</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">卵</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">980</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">11</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ヨーグルト</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
</tbody>
</table></figure>

<pre class="colab-output">注文日     object
カテゴリ    object
商品      object
売上       int64
数量       int64
dtype: object
</pre>

<p><code>注文日</code> は日付のように見えますが、この時点では <code>object</code> 型です。</p>
<p><code>resample()</code> で日付を基準に集計するには、日付列を <code>datetime</code> 型に変換する必要があります。</p>
<p>CSVやExcelを読み込んだ直後は、まず <code>dtypes</code> や <code>info()</code> で型を確認するのが大切です。</p>


<h2><span id="toc5">resample()を使う前に日付列をdatetime型にする</span></h2>
<p><code>注文日</code> を <code>pd.to_datetime()</code> で <code>datetime</code> 型に変換します。</p>
<p>ここでは、変換後に日付順で並び替えておきます。<br>
日付順に並んでいなくても集計自体はできますが、表示や確認がしやすくなります。</p>


<pre class="line-numbers"><code class="language-python">df_date = df.copy()

df_date["注文日"] = pd.to_datetime(df_date["注文日"])
df_date = df_date.sort_values("注文日")

display(df_date)
print(df_date.dtypes)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">カテゴリ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">数量</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">パン</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">9</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ノート</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">600</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-18</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">お茶</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1500</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">歯ブラシ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">700</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">洗剤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2600</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">卵</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">980</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">シャンプー</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-25</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">お米</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">牛乳</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">11</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ヨーグルト</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">コーヒー</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1800</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ティッシュ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">900</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
</tbody>
</table></figure>

<pre class="colab-output">注文日     datetime64[ns]
カテゴリ            object
商品              object
売上               int64
数量               int64
dtype: object
</pre>

<p><code>注文日</code> の型が <code>datetime64[ns]</code> になりました。</p>
<p>これで、pandasがこの列を「日付として扱える状態」になりました。</p>
<p>日付変換そのものを詳しく知りたい場合は、<a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方</a>で、<code>format</code> や <code>NaT</code> の考え方を確認できます。</p>


<h2><span id="toc6">方法1：日付列をインデックスにしてresample()する</span></h2>
<p><code>resample()</code> の基本は、日付列をインデックスにしてから集計する書き方です。</p>
<p>ここでは、<code>set_index("注文日")</code> で <code>注文日</code> をインデックスにします。</p>


<pre class="line-numbers"><code class="language-python">df_time = df_date.set_index("注文日")

display(df_time)
print(type(df_time.index))
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">カテゴリ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">数量</th>
</tr>

</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">パン</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ノート</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">600</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-18</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">お茶</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1500</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">歯ブラシ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">700</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">洗剤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2600</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">卵</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">980</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">シャンプー</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-25</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">お米</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">牛乳</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ヨーグルト</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">食品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">コーヒー</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1800</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日用品</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">ティッシュ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">900</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
</tbody>
</table></figure>

<pre class="colab-output">&lt;class 'pandas.core.indexes.datetimes.DatetimeIndex'&gt;
</pre>

<p><code>注文日</code> がインデックスになり、<code>DatetimeIndex</code> として扱われるようになりました。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">状態</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文日の位置</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">resample()での扱いやすさ</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">処理前</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">通常の列</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">そのままでは基本形のresample()に使いにくい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">処理後</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">DatetimeIndex</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>df.resample("MS")</code> のように集計できる</td>
</tr>
</tbody>
</table></figure>
<p><code>set_index()</code> の詳しい使い方は、<a href="https://pythondatalab.com/pandas-set-index/">pandas set_index()の使い方</a>で確認できます。</p>


<h2><span id="toc7">月別売上を集計する：resample(&#8220;MS&#8221;).sum()</span></h2>
<p>まずは、月別の売上合計を出します。</p>
<p>ここでは <code>resample("MS")</code> を使います。</p>
<ul>
<li><code>MS</code> は、月初基準の月別集計です</li>
<li><code>ME</code> は、月末基準の月別集計です</li>
<li>古い記事では <code>M</code> と書かれていることがありますが、最近のpandasでは月末基準を表すなら <code>ME</code> を使う方が安全です</li>
<li><code>sum()</code> は、売上を合計するために使います</li>
</ul>
<p>「月別売上を知りたい」場合は、平均ではなく合計を出すことが多いため、ここでは <code>sum()</code> を使います。</p>
<p>この記事では、月ごとの結果を表で見たときに読みやすいように、月初の日付で表示される <code>MS</code> を中心に使います。</p>


<pre class="line-numbers"><code class="language-python">monthly_sales = df_time.resample("MS")["売上"].sum().to_frame("月別売上合計")

display(monthly_sales)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">月別売上合計</th>
</tr>

</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
</tr>
</tbody>
</table></figure>

<p>1件ずつ並んでいた明細データが、月ごとの売上合計にまとまりました。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">処理前</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">処理後</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">注文日ごとに1行ずつ並んだ明細データ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月ごとに売上を合計した集計表</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">売上の推移が見えにくい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026年1月、2月、3月の売上合計を比較しやすい</td>
</tr>
</tbody>
</table></figure>
<p>このように、<code>resample()</code> は時系列データを「見やすい単位」にまとめるときに役立ちます。</p>


<h3><span id="toc8">出力例で見る：MS・ME・Mの違い</span></h3>
<p><code>MS</code> と <code>ME</code> の違いは、集計結果の「ラベル日付」に出ます。</p>
<ul>
<li><code>MS</code>：月初の日付で表示されます</li>
<li><code>ME</code>：月末の日付で表示されます</li>
<li><code>M</code>：古い記事や古いコードで見かける月末基準の書き方です</li>
</ul>
<p>売上合計の金額は同じでも、表示される日付ラベルが変わる点を確認してみましょう。</p>


<pre class="line-numbers"><code class="language-python">monthly_ms = df_time.resample("MS")["売上"].sum().reset_index()
monthly_ms.columns = ["MSのラベル日付", "MSの売上合計"]

monthly_me = df_time.resample("ME")["売上"].sum().reset_index()
monthly_me.columns = ["MEのラベル日付", "MEの売上合計"]

# 古い記事では resample("M") を見かけることがあります。
# 最近のpandasでは月末基準を表す場合、resample("ME") を使う方が安全です。
try:
    import warnings

    with warnings.catch_warnings():
        warnings.simplefilter("ignore", FutureWarning)
        monthly_m = df_time.resample("M")["売上"].sum().reset_index()

    monthly_m.columns = ["Mのラベル日付", "Mの売上合計"]
    display(pd.concat([monthly_ms, monthly_me, monthly_m], axis=1))

except Exception:
    print("このpandas環境では resample('M') を実行できません。月末基準は resample('ME') を使ってください。")
    display(pd.concat([monthly_ms, monthly_me], axis=1))
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">MSのラベル日付</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">MSの売上合計</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">MEのラベル日付</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">MEの売上合計</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">Mのラベル日付</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">Mの売上合計</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-31</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-31</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-31</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-31</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
</tr>
</tbody>
</table></figure>

<p><code>MS</code> は <code>2026-01-01</code>、<code>2026-02-01</code> のように月初の日付で表示されます。</p>
<p>一方、<code>ME</code> は <code>2026-01-31</code>、<code>2026-02-28</code> のように月末の日付で表示されます。</p>
<p>古い記事で見かける <code>M</code> は、月末基準の古い書き方として出てくることがあります。新しく記事を書く場合や、これから学ぶ場合は、月末基準なら <code>ME</code>、月初基準なら <code>MS</code> と覚えておくと混乱しにくいです。</p>


<h2><span id="toc9">頻度指定の基本：D・W・MS・MEを使い分ける</span></h2>
<p><code>resample()</code> のカッコの中には、どの時間単位でまとめるかを指定します。</p>
<p>初心者のうちは、まず次の指定を覚えれば十分です。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">指定</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">意味</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">使う場面</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"D"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日別</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日ごとの平均・件数を見たい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"W"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">週別</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">週ごとの注文件数や売上を見たい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"MS"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別（月初基準）</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別集計を月初の日付で表示したい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"ME"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別（月末基準）</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別集計を月末の日付で表示したい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"M"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別（月末基準の古い書き方）</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">古い記事や古いコードで見かけることがある</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"QE"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">四半期</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">四半期ごとに軽くまとめたい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>"YE"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">年別</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">年ごとに軽くまとめたい</td>
</tr>
</tbody>
</table></figure>
<p>検索すると、月別集計の例で <code>resample("M")</code> を見かけることがあります。
ただし、最近のpandasでは <code>M</code> よりも、月末基準なら <code>ME</code>、月初基準なら <code>MS</code> と書く方がわかりやすく、今後も安心です。</p>
<p>この記事では、月別の表として見やすいように、主に <code>"MS"</code> を使います。</p>


<h2><span id="toc10">複数の集計をまとめて出す</span></h2>
<p>月別に、売上合計・注文件数・平均売上・数量合計をまとめて出すこともできます。</p>
<p>ここでは、次のように集計します。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">出したい値</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">使う集計</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">売上合計</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>sum()</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">注文件数</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>count()</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">平均売上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>mean()</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">数量合計</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>sum()</code></td>
</tr>
</tbody>
</table></figure>
<p>売上合計と平均売上は意味が違います。<br>
また、<code>count()</code> は指定した列の欠損値を数えません。今回のように <code>売上</code> 列に欠損がない前提なら注文件数として使えますが、行数そのものを数えたい場合は <code>size()</code> も候補になります。<br>
見出しや表の名前と、実際に使う集計方法がズレないように注意しましょう。</p>


<pre class="line-numbers"><code class="language-python">monthly_summary = df_time.resample("MS").agg(
    売上合計=("売上", "sum"),
    注文件数=("売上", "count"),
    平均売上=("売上", "mean"),
    数量合計=("数量", "sum")
)

display(monthly_summary)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">売上合計</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文件数</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">平均売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">数量合計</th>
</tr>

</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1000.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2745.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1275.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">9</td>
</tr>
</tbody>
</table></figure>

<p>この表を見ると、月ごとの売上合計だけでなく、注文件数や平均売上も確認できます。</p>
<p>実務では、売上合計だけを見ると「2月が大きい」とわかります。<br>
さらに注文件数や平均売上を見ると、「件数が多いのか、1件あたりの売上が大きいのか」も確認しやすくなります。</p>


<h2><span id="toc11">週別件数を集計する：resample(&#8220;W&#8221;).count()</span></h2>
<p>次に、週ごとの注文件数を数えてみます。</p>
<p>ここでは「売上の合計」ではなく、「何件の注文があったか」を見たいので、<code>count()</code> を使います。今回のサンプルでは <code>売上</code> 列に欠損がないため、<code>売上</code> を数えることで注文件数を確認できます。</p>


<pre class="line-numbers"><code class="language-python">weekly_count = df_time.resample("W")["売上"].count().to_frame("週別注文件数")

display(weekly_count)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">週別注文件数</th>
</tr>

</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-11</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-18</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-25</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-08</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-22</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-08</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-22</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-29</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
</tr>
</tbody>
</table></figure>

<p><code>W</code> は週別の集計です。</p>
<p>週別集計では、週の区切り方によって結果の見え方が変わることがあります。<br>
初心者のうちは、まず「週ごとにざっくり件数を見る」用途で使い、細かい週の開始日・終了日の指定は必要になったときに確認すれば十分です。</p>


<h2><span id="toc12">日別平均を集計する：resample(&#8220;D&#8221;).mean()</span></h2>
<p>次に、日別の平均売上を確認します。</p>
<p>ここでは <code>resample("D")</code> で日別にまとめ、<code>mean()</code> で平均を出します。</p>


<pre class="line-numbers"><code class="language-python">daily_mean = df_time.resample("D")["売上"].mean().to_frame("日別平均売上")

display(daily_mean.head(10))
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">日別平均売上</th>
</tr>

</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1200.0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-06</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-07</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-08</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-09</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-11</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">600.0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-13</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-14</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
</tr>
</tbody>
</table></figure>

<p>日別にすると、注文がない日も期間として表示されることがあります。</p>
<p>この例では、注文がない日の平均売上は <code>NaN</code> になります。<br>
これはエラーではなく、「その日に集計できるデータがなかった」という意味です。</p>
<p>欠損期間の補完や <code>ffill()</code>、<code>interpolate()</code> などの処理は便利ですが、この記事では深入りしません。<br>
まずは、<code>resample()</code> によって空の期間が見えることがある、と理解しておきましょう。</p>


<h2><span id="toc13">方法2：on引数で日付列を指定してresample()する</span></h2>
<p><code>resample()</code> は、必ず <code>set_index()</code> しないと使えないわけではありません。</p>
<p>日付列が <code>datetime</code> 型になっていれば、<code>on="注文日"</code> のように指定して集計できます。</p>
<p>インデックスを変更したくない場合は、この書き方が便利です。</p>


<pre class="line-numbers"><code class="language-python">monthly_sales_on = (
    df_date
    .resample("MS", on="注文日")["売上"]
    .sum()
    .reset_index(name="月別売上合計")
)

display(monthly_sales_on)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">月別売上合計</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
</tr>
</tbody>
</table></figure>

<p><code>on="注文日"</code> を使うと、<code>注文日</code> をインデックスにしなくても月別集計ができます。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">書き方</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>set_index("注文日").resample("MS")</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">時系列データとして扱う流れがわかりやすい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>resample("MS", on="注文日")</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">インデックスを変えずに日付列を指定できる</td>
</tr>
</tbody>
</table></figure>
<p>初心者の学習では、まず <code>set_index()</code> する基本形を理解し、慣れてきたら <code>on</code> 引数を使うとよいです。</p>


<h2><span id="toc14">groupby()・dt・resample()の違い</span></h2>
<p>日付データを扱うときは、<code>groupby()</code>、<code>dt</code>、<code>resample()</code> の違いで迷いやすいです。</p>
<p>ここで一度、使い分けを整理します。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">使うもの</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">役割</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>resample()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日付を日別・週別・月別などの時間単位で集計する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別売上、週別件数</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>groupby()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">カテゴリや作成した列ごとに集計する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">カテゴリ別売上、店舗別平均</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>dt</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日付から年・月・曜日などを取り出す</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月列を作る、曜日列を作る</td>
</tr>
</tbody>
</table></figure>
<p>月別集計は、<code>dt.month</code> で月列を作って <code>groupby()</code> する方法でもできます。<br>
ただし、年をまたぐデータで「月」だけを使うと、2025年1月と2026年1月が混ざる可能性があります。</p>
<p>日付の流れに沿って月別・週別にまとめたい場合は、<code>resample()</code> を使うと自然です。</p>


<h2><span id="toc15">比較用：dtで年月列を作ってgroupby()する方法</span></h2>
<p>比較のために、<code>dt.to_period("M")</code> で年月列を作り、<code>groupby()</code> で月別集計する例も確認します。</p>
<p>これは <code>resample()</code> の代わりに使える場面もありますが、この記事ではあくまで違いを理解するための補足です。</p>


<pre class="line-numbers"><code class="language-python">df_group = df_date.copy()

df_group["年月"] = df_group["注文日"].dt.to_period("M")

monthly_groupby = (
    df_group
    .groupby("年月")["売上"]
    .sum()
    .reset_index(name="月別売上合計")
)

display(monthly_groupby)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">年月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">月別売上合計</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
</tr>
</tbody>
</table></figure>

<p><code>dt</code> と <code>groupby()</code> を組み合わせても月別集計はできます。</p>
<p>ただし、今回のように「日付を時間単位でまとめる」ことが目的なら、<code>resample()</code> を使うと、日別・週別・月別への切り替えがしやすくなります。</p>
<p><code>dt</code> の詳しい使い方は <a href="https://pythondatalab.com/pandas-dt/">pandas dtの使い方</a> で、カテゴリ別集計は <a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas groupby×aggの使い方</a> で確認できます。</p>


<h2><span id="toc16">補足：resample()とasfreq()の違い</span></h2>
<p>時系列データの記事では、<code>resample()</code> と一緒に <code>asfreq()</code> というメソッドを見かけることがあります。</p>
<p>初心者のうちは、まず次のように分けて考えると十分です。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">使うもの</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">考え方</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">月別売上の合計を出したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>resample().sum()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">期間ごとに集計する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">週別の平均を出したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>resample().mean()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">期間ごとに集計する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">日付の間隔だけそろえたい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>asfreq()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">指定した頻度の行を作る</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">欠けている日付を表示したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>asfreq()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">集計せず、日付の並びをそろえる</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">欠けた期間も含めて集計結果を確認したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>resample()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">期間の箱を作って集計する</td>
</tr>
</tbody>
</table></figure>
<p><code>resample()</code> は、日付を一定期間の箱に分けて、その箱ごとに合計・平均・件数などを計算します。</p>
<p>一方、<code>asfreq()</code> は、日付の頻度をそろえるための処理です。基本的には集計をするメソッドではありません。</p>
<p>この記事では、月別売上や週別件数のように「期間ごとに集計する」ことが目的なので、主役は <code>resample()</code> です。ここでは、<code>asfreq()</code> が集計ではなく日付の間隔をそろえる処理であることを、短いコードで確認します。</p>


<pre class="line-numbers"><code class="language-python">daily_asfreq = df_time["売上"].asfreq("D").to_frame("asfreq_D")
daily_resample_sum = df_time["売上"].resample("D").sum().to_frame("resample_D_sum")

daily_compare = pd.concat([daily_asfreq, daily_resample_sum], axis=1)

display(daily_compare.head(10))
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">asfreq_D</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">resample_D_sum</th>
</tr>

</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1200.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1200</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-06</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-07</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-08</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-09</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-11</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-12</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">600.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">600</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-13</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-14</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
</tr>
</tbody>
</table></figure>

<p>上の表を見ると、<code>asfreq("D")</code> は日付の間隔を日別にそろえるだけなので、注文がない日は <code>NaN</code> になります。</p>
<p>一方、<code>resample("D").sum()</code> は日別の箱を作って売上を合計するため、注文がない日は合計が0のように表示されることがあります。</p>
<p>つまり、<strong>集計したいなら <code>resample()</code>、日付の並びをそろえたいなら <code>asfreq()</code></strong> と考えると分かりやすいです。</p>


<h2><span id="toc17">集計結果をreset_index()で通常の表に戻す</span></h2>
<p><code>resample()</code> の結果は、日付がインデックスになっていることが多いです。</p>
<p>このままでも分析できますが、CSVに保存したり、他の表と結合したり、WordPress記事で表として見せたりする場合は、<code>reset_index()</code> で通常の列に戻すと扱いやすくなります。</p>


<pre class="line-numbers"><code class="language-python">monthly_summary_reset = monthly_summary.reset_index()

monthly_summary_reset["年月"] = monthly_summary_reset["注文日"].dt.strftime("%Y-%m")

display(monthly_summary_reset)
</code></pre>

<figure class="wp-block-table"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">売上合計</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">注文件数</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">平均売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">数量合計</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">年月</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1000.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-01</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">10980</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2745.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-02</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">5100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">1275.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">9</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">2026-03</td>
</tr>
</tbody>
</table></figure>

<p><code>reset_index()</code> によって、インデックスだった <code>注文日</code> が通常の列に戻りました。</p>
<p>さらに <code>strftime("%Y-%m")</code> を使うと、<code>2026-01</code> のような年月表示も作れます。</p>
<p><code>reset_index()</code> の詳しい使い方は、<a href="https://pythondatalab.com/pandas-reset-index/">pandas reset_index()の使い方</a>で確認できます。</p>


<h2><span id="toc18">集計結果をグラフで確認する</span></h2>
<p>月別集計ができたら、折れ線グラフや棒グラフにすると推移を確認しやすくなります。</p>
<p>ここでは、月別売上合計を簡単な折れ線グラフで表示します。<br>
グラフ装飾は深入りせず、集計結果を可視化につなげる流れだけ確認します。</p>
<p>なお、Google Colabでは日本語フォント設定をしていないと、グラフ内の日本語ラベルが文字化けすることがあります。ここでは、まず <code>resample()</code> の集計結果を確認することを優先し、グラフのタイトルや軸ラベルは英語表記にしています。</p>
<p>ここでは月別の集計結果を折れ線グラフにします。日付ラベルが重ならないように、x軸の表示を<code>YYYY-MM</code>形式にし、ラベルを少し回転させています。</p>


<pre class="line-numbers"><code class="language-python">import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plot_df = monthly_summary_reset.copy()

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(plot_df["注文日"], plot_df["売上合計"], marker="o")

ax.set_title("Monthly Sales")
ax.set_xlabel("Month")
ax.set_ylabel("Sales")
ax.grid(True)

# x軸の日付ラベルが重ならないように、表示形式と角度を調整します
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m"))
plt.xticks(rotation=45, ha="right")
plt.tight_layout()

plt.show()
</code></pre>

<figure class="colab-figure">
  <img decoding="async" src="images/figure1.png" alt="グラフの出力画像1">
  <figcaption>グラフの出力画像1</figcaption>
</figure>

<p>このように、<code>resample()</code> で月別に集計すると、売上の推移をグラフで確認しやすくなります。</p>
<p>折れ線グラフの設定を詳しく知りたい場合は、<a href="https://pythondatalab.com/matplotlib-line-legend-color/">Matplotlib折れ線グラフの描き方</a>を参考にしてください。<br>
月別売上を棒グラフで比較したい場合は、<a href="https://pythondatalab.com/matplotlib-bar-barh-stacked/">Matplotlib 棒グラフ入門</a>も役立ちます。</p>


<h2><span id="toc19">よくあるミスと確認ポイント</span></h2>
<p><code>resample()</code> でつまずきやすいポイントを整理します。</p>
<h3><span id="toc20">日付列がobject型のままになっている</span></h3>
<p>日付に見えても、<code>object</code> 型のままだと <code>resample()</code> でうまく扱えません。</p>
<p>まず <code>pd.to_datetime()</code> で日付型に変換しましょう。</p>
<h3><span id="toc21">DatetimeIndexまたはonで指定した日付列が必要</span></h3>
<p><code>resample()</code> は、日付列そのものを自動で探してくれるわけではありません。</p>
<p>基本形では、日付列をインデックスにします。<br>
インデックスにしたくない場合は、<code>on="注文日"</code> のように指定します。</p>
<h3><span id="toc22">売上合計・平均・件数を混同しない</span></h3>
<p><code>sum()</code>、<code>mean()</code>、<code>count()</code> は意味が違います。</p>
<figure class="wp-block-table"><table class="wp-block-table" style="width: auto; border-collapse: collapse; margin: 0.8em 0;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">見たいもの</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9; font-weight: 600; background: #f7f7f7;">使う集計</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">売上合計</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>sum()</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">平均売上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>mean()</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;">注文件数</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #d9d9d9;"><code>count()</code> または <code>size()</code></td>
</tr>
</tbody>
</table></figure>
<p><code>count()</code> は、指定した列の欠損値を数えません。欠損を含む列で件数を数える場合は、<code>count()</code> と <code>size()</code> の違いに注意します。</p>
<p>「月別売上を集計する」という見出しなら <code>sum()</code>、<br>
「平均を出す」という見出しなら <code>mean()</code> を使うように、説明とコードを一致させることが大切です。</p>
<h3><span id="toc23">月だけでgroupbyすると年をまたいだときに混ざる</span></h3>
<p><code>dt.month</code> だけで集計すると、2025年1月と2026年1月が同じ「1月」としてまとまる可能性があります。</p>
<p>年をまたぐデータでは、<code>dt.to_period("M")</code> を使うか、<code>resample()</code> で年月を意識した集計にする方が安全です。</p>
<h3><span id="toc24">欠損期間が出ることがある</span></h3>
<p>日別や週別で集計すると、データがない期間が表示されることがあります。<br>
平均なら <code>NaN</code>、合計なら0のように見える場合があります。</p>
<p>これは、<code>resample()</code> が時間の区切りを作って集計しているためです。</p>


<h2><span id="toc25">resample()はデータ分析の流れのどこで使うか</span></h2>
<p><code>resample()</code> は、データ分析の流れの中では「日付を使った集計」の場面で使います。</p>
<p>全体の流れで見ると、次の位置づけです。</p>
<ol>
<li>CSVやExcelを読み込む</li>
<li><code>head()</code> や <code>info()</code> でデータを確認する</li>
<li><code>to_datetime()</code> で日付列を日付型にする</li>
<li>必要に応じて <code>sort_values()</code> で日付順に並べる</li>
<li><code>resample()</code> で日別・週別・月別に集計する</li>
<li><code>reset_index()</code> で表として扱いやすくする</li>
<li>Matplotlibで推移を可視化する</li>
</ol>
<p>つまり、<code>resample()</code> は、単独で覚えるよりも、<strong>日付変換・集計・可視化へ進む流れの中で覚える</strong>と使いやすくなります。</p>
<p>なお、移動平均を出す <code>rolling()</code> や、頻度をそろえる <code>asfreq()</code> も時系列データで使われます。<br>
ただし、この記事では <code>resample()</code> の基本に集中するため、詳しい使い方は別記事で扱う範囲です。</p>


<h2><span id="toc26">まとめ</span></h2>
<p>この記事では、pandasの <code>resample()</code> を使って、日付データを月別・週別・日別に集計する方法を解説しました。</p>
<p>重要なポイントは次のとおりです。</p>
<ul>
<li><code>resample()</code> は、日付データを日別・週別・月別などの時間単位で集計するために使う</li>
<li>使う前に、日付列を <code>pd.to_datetime()</code> で <code>datetime</code> 型に変換する</li>
<li>基本形では、<code>set_index("日付列")</code> で日付をインデックスにしてから <code>resample()</code> する</li>
<li>インデックスを変えたくない場合は、<code>on="日付列"</code> を使える</li>
<li>月別売上なら <code>sum()</code>、平均売上なら <code>mean()</code>、件数なら <code>count()</code> を使う</li>
<li>カテゴリ別にまとめたいなら <code>groupby()</code>、年・月・曜日を取り出したいなら <code>dt</code>、時間単位でまとめたいなら <code>resample()</code> を使う</li>
<li>集計結果は <code>reset_index()</code> で通常の表に戻すと扱いやすい</li>
<li>月別集計の結果は、折れ線グラフや棒グラフにすると推移を確認しやすい</li>
</ul>
<p><code>resample()</code> を使えるようになると、CSVやExcelで読み込んだ日付付きデータから、月別売上・週別件数・日別平均などを作れるようになります。</p>
<p>日付データを前処理して、集計し、可視化する流れの中で、とても役立つメソッドです。</p>


<h2><span id="toc27">次に読みたい関連記事</span></h2>
<p>日付集計をさらに理解するには、次の記事も参考になります。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換と format・NaT 対処を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-dt/">pandas dtの使い方｜日付から年・月・曜日を取り出す方法を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-set-index/">pandas set_index()の使い方｜列をインデックスにする・drop=False・index_col・reset_indexとの違いを解説</a></li>
<li><a href="https://pythondatalab.com/pandas-reset-index/">pandas reset_index()の使い方｜インデックスを振り直す・drop=Trueを初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas groupby×aggの使い方｜基本の集計とaggの書き方を例で解説</a></li>
<li><a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門｜sort_values・sort_indexの違いと複数列ソート</a></li>
<li><a href="https://pythondatalab.com/matplotlib-line-legend-color/">Matplotlib折れ線グラフの描き方：色・線種・凡例を完全解説</a></li>
<li><a href="https://pythondatalab.com/matplotlib-bar-barh-stacked/">Matplotlib 棒グラフ入門：横棒・グループ化・積み上げまで解説</a></li>
<li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜Drive連携とpandas read_csvを初心者向けに解説</a></li>
</ul>

<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc28"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>



<script>Prism.highlightAll();</script>

</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1780219709616" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">resample()とgroupby()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>resample()</code> は、日付を日別・週別・月別などの時間単位でまとめるときに使います。<br />一方、<code>groupby()</code> は、カテゴリ・店舗・商品など、列の値ごとにまとめるときに使います。<br />月別売上や週別件数のように、時間の区切りで集計したい場合は <code>resample()</code> が向いています。<br />カテゴリ別売上や店舗別平均のように、分類ごとに集計したい場合は <code>groupby()</code> が向いています。</p>

</div>
</div>
<div id="faq-question-1780219745235" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">resample()とasfreq()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code><br />resample()</code> は、日付を一定期間ごとにまとめて、合計・平均・件数などを計算するために使います。<br />一方、<code>asfreq()</code> は、日付の間隔をそろえるために使います。基本的には集計をするメソッドではありません。<br />たとえば、注文がない日を日付として表示したいだけなら <code>asfreq()</code>、日ごとの売上合計を出したいなら <code>resample("D").sum()</code> を使います。<br />月別売上や週別件数を出したい場合は <code>resample()</code>、日付の並びをそろえたい場合は <code>asfreq()</code> と考えると分かりやすいです。</p>

</div>
</div>
<div id="faq-question-1780219757098" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">resample()を使うには必ずset_index()が必要ですか？</span></h3>
<div class="rank-math-answer ">

<p>必ずではありません。<br />基本形では、日付列を <code>set_index()</code> でインデックスにしてから <code>resample()</code> します。<br />ただし、日付列が <code>datetime</code> 型になっていれば、<code>resample("MS", on="注文日")</code> のように <code>on</code> 引数で日付列を指定することもできます。</p>

</div>
</div>
<div id="faq-question-1780219770722" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">日付列がobject型のままだとresample()できますか？</span></h3>
<div class="rank-math-answer ">

<p>基本的には、日付列は <code>datetime</code> 型に変換してから使います。<br />日付に見える文字列でも、pandas上では <code>object</code> 型になっていることがあります。<br />その場合は、先に <code>pd.to_datetime()</code> で変換しましょう。</p>

</div>
</div>
<div id="faq-question-1780219787554" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc33">月別集計はresample()とdt.month＋groupby()のどちらがよいですか？</span></h3>
<div class="rank-math-answer ">

<p>日付の流れに沿って月別・週別・日別に集計したい場合は、<code>resample()</code> が自然です。<br /><code>dt.month</code> で月だけを取り出して <code>groupby()</code> する方法もありますが、年をまたぐデータでは、2025年1月と2026年1月が混ざる可能性があります。<br />年も含めて集計したい場合は、<code>dt.to_period("M")</code> を使うか、<code>resample()</code> を使うと安全です。</p>

</div>
</div>
<div id="faq-question-1780219802554" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc34">resample(&#8220;M&#8221;)・resample(&#8220;ME&#8221;)・resample(&#8220;MS&#8221;)の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>MS</code> は月初基準、<code>ME</code> は月末基準の月別集計です。<br />たとえば、1月の集計結果を <code>2026-01-01</code> のような月初日付で表示したい場合は <code>MS</code>、<code>2026-01-31</code> のような月末日付で表示したい場合は <code>ME</code> を使います。<br />古い記事や古いコードでは <code>resample("M")</code> を見かけることがあります。これは月末基準の古い書き方として出てくることがありますが、最近のpandasでは <code>ME</code> と書く方が安全です。<br />初心者向けの記事や表では、月初基準の <code>MS</code> の方が月ごとのまとまりを読み取りやすいことがあります。</p>

</div>
</div>
<div id="faq-question-1780219831290" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc35">resample()した後に普通の列に戻すにはどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p><code>reset_index()</code> を使います。<br /><code>resample()</code> の結果は、日付がインデックスになっていることがあります。<br />CSVに保存したり、他のDataFrameと結合したり、表として見せたりする場合は、<code>reset_index()</code> で日付を通常の列に戻すと扱いやすくなります。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方｜日付データを月別・週別に集計する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-resample/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas crosstab()の使い方｜2つの列をクロス集計・割合表示する方法</title>
		<link>https://pythondatalab.com/pandas-crosstab/</link>
					<comments>https://pythondatalab.com/pandas-crosstab/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 10 May 2026 15:41:24 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2072</guid>

					<description><![CDATA[<p>pandasのcrosstab()を使って、2つの列の組み合わせをクロス集計する方法を初心者向けに解説。value_counts()との違い、合計行・合計列、normalizeによる割合表示、欠損値の注意点までわかります。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-crosstab/">pandas crosstab()の使い方｜2つの列をクロス集計・割合表示する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[

<div class="colab-article">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">

<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>

<style>
  .colab-article pre[class*="language-"],
  .colab-article pre.line-numbers {
    margin: 0 !important;
    padding: 1em !important;
  }
  .colab-article code {
    font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;
  }
  .colab-article table.wp-block-table {
    width: auto;
    border-collapse: collapse;
    margin: 0.8em 0 1.2em 0;
    display: block;
    overflow-x: auto;
    max-width: 100%;
  }
  .colab-article table.wp-block-table th,
  .colab-article table.wp-block-table td {
    border: 1px solid #ddd;
  }
  .colab-article .colab-output {
    margin: 0.8em 0 1.2em 0 !important;
    padding: 0.8em !important;
    background: #f6f8fa;
    overflow-x: auto;
  }
  .colab-article figure.colab-figure {
    margin: 1em 0;
  }
  .colab-article figure.colab-figure img {
    max-width: 100%;
    height: auto;
  }
</style>


<p>CSVを読み込んだあと、「地域ごとに購入あり・購入なしの件数を見たい」「年代ごとに満足度の分布を確認したい」と思うことがあります。</p>
<p>このように、<strong>2つの列の組み合わせごとの件数を表で見たい</strong>ときに便利なのが、pandasの <code>crosstab()</code> です。</p>
<p><code>crosstab()</code> を使うと、たとえば「地域×購入有無」「年代×満足度」のようなクロス集計表を短いコードで作れます。</p>
<p>基本形は次のとおりです。</p>
<pre class="line-numbers"><code class="language-python">
pd.crosstab(df[&quot;行にしたい列&quot;], df[&quot;列にしたい列&quot;])
</code></pre>
<p>この記事では、pandasの <code>crosstab()</code> を使って、2つの列を組み合わせたクロス集計表を作る方法を解説します。あわせて、<code>value_counts()</code>、<code>groupby()</code>、<code>pivot_table()</code> との違い、割合表示、合計行・合計列も整理します。</p>



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">crosstab()が役立つ場面</a></li><li><a href="#toc3" tabindex="0">サンプルデータを作成する</a></li><li><a href="#toc4" tabindex="0">1列だけならvalue_counts()で確認する</a></li><li><a href="#toc5" tabindex="0">2つの列を組み合わせたクロス集計表を作る</a><ol><li><a href="#toc6" tabindex="0">地域×購入有無を集計する</a></li><li><a href="#toc7" tabindex="0">行と列を入れ替えると見え方が変わる</a></li><li><a href="#toc8" tabindex="0">年代×満足度を集計する</a></li></ol></li><li><a href="#toc9" tabindex="0">合計行・合計列を追加する</a></li><li><a href="#toc10" tabindex="0">件数を割合で表示する</a><ol><li><a href="#toc11" tabindex="0">全体に対する割合を見る</a></li><li><a href="#toc12" tabindex="0">行ごとの割合を見る</a></li><li><a href="#toc13" tabindex="0">列ごとの割合を見る</a></li><li><a href="#toc14" tabindex="0">小数を見やすく丸める</a></li></ol></li><li><a href="#toc15" tabindex="0">欠損値があるときの注意点</a></li><li><a href="#toc16" tabindex="0">実務では、件数表から割合表示につなげる</a></li><li><a href="#toc17" tabindex="0">まとめ</a></li><li><a href="#toc18" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc19" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc20" tabindex="0">value_counts()ではなくcrosstab()を使うのはどんなときですか？</a></li><li><a href="#toc21" tabindex="0">crosstab()で売上合計や平均値も出せますか？</a></li><li><a href="#toc22" tabindex="0">pivot_table()ではなくcrosstab()を使うのはどんなときですか？</a></li><li><a href="#toc23" tabindex="0">crosstab()で割合を表示できますか？</a></li><li><a href="#toc24" tabindex="0">crosstab()で合計行や合計列を追加できますか？</a></li><li><a href="#toc25" tabindex="0">valuesやaggfuncも使う必要がありますか？</a></li><li><a href="#toc26" tabindex="0">欠損値がある場合、crosstab()の結果はどうなりますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<p>この記事では、<code>crosstab()</code> で2つの列の組み合わせを集計する方法を学びます。</p>
<p>具体的には、次の内容を扱います。</p>
<ul>
<li><code>pd.crosstab()</code> の基本的な使い方</li>
<li>1列だけを見る <code>value_counts()</code> との違い</li>
<li>2つの列を組み合わせたクロス集計表の作り方</li>
<li>合計行・合計列を追加する方法</li>
<li>件数を割合で表示する方法</li>
<li>欠損値があるときの注意点</li>
<li><code>crosstab()</code> が役立つ実践的な場面</li>
</ul>
<p><code>crosstab()</code> は、<code>value_counts()</code> で1列の件数を確認したあとに、<strong>2つの列の関係を表で見たいとき</strong>に使うメソッドです。</p>


<h2><span id="toc2">crosstab()が役立つ場面</span></h2>
<p><code>crosstab()</code> は、2つの列の組み合わせごとの件数を見たい場面で役立ちます。</p>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">場面</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">見たい組み合わせ</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">購入データの確認</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">地域 × 購入有無</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">アンケート分析</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">年代 × 満足度</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">A/Bテストの確認</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">パターンA/B × 申込有無</td>
</tr>
</tbody>
</table>
<p>この記事では、まず <code>地域×購入有無</code> と <code>年代×満足度</code> の例で、基本的なクロス集計を確認します。</p>


<h2><span id="toc3">サンプルデータを作成する</span></h2>
<p>ここでは、地域・年代・商品カテゴリ・購入有無・満足度を含む小さなデータを使います。</p>
<p>実務ではCSVから読み込むことが多いですが、この記事ではGoogle Colabでそのまま試せるように、DataFrameを直接作成します。</p>


<pre class="line-numbers"><code class="language-python">
import pandas as pd

df = pd.DataFrame({
    &quot;地域&quot;: [&quot;東京&quot;, &quot;東京&quot;, &quot;東京&quot;, &quot;大阪&quot;, &quot;大阪&quot;, &quot;大阪&quot;, &quot;名古屋&quot;, &quot;名古屋&quot;, &quot;福岡&quot;, None],
    &quot;年代&quot;: [&quot;20代&quot;, &quot;20代&quot;, &quot;30代&quot;, &quot;40代&quot;, &quot;40代&quot;, &quot;30代&quot;, &quot;20代&quot;, &quot;30代&quot;, &quot;40代&quot;, &quot;30代&quot;],
    &quot;商品カテゴリ&quot;: [&quot;PC&quot;, &quot;PC&quot;, &quot;文房具&quot;, &quot;家具&quot;, &quot;家具&quot;, &quot;文房具&quot;, &quot;PC&quot;, &quot;文房具&quot;, &quot;家具&quot;, &quot;PC&quot;],
    &quot;購入有無&quot;: [&quot;購入あり&quot;, &quot;購入あり&quot;, &quot;購入あり&quot;, &quot;購入なし&quot;, &quot;購入なし&quot;, &quot;購入なし&quot;, &quot;購入あり&quot;, &quot;購入なし&quot;, &quot;購入なし&quot;, &quot;購入あり&quot;],
    &quot;満足度&quot;: [&quot;高い&quot;, &quot;高い&quot;, &quot;普通&quot;, &quot;低い&quot;, &quot;低い&quot;, &quot;普通&quot;, &quot;高い&quot;, &quot;普通&quot;, &quot;低い&quot;, None]
})

df
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">地域</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">年代</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入有無</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">満足度</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">高い</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">高い</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">文房具</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">普通</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">40代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">家具</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">低い</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">40代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">家具</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">低い</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">文房具</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">普通</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">高い</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">文房具</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">普通</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">8</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">40代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">家具</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">低い</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">9</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">None</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">None</td>
    </tr>
  </tbody>
</table>

<p>このデータでは、クロス集計後の傾向が見えやすいように、次のような特徴を入れています。</p>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">列名</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">使いどころ</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">地域</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京は購入ありが多く、大阪は購入なしが多い例に使う</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">年代</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代は満足度が高く、40代は低い例に使う</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品カテゴリ</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">カテゴリ列の例として使う</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">購入有無</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">地域ごとの購入状況を比較する</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">満足度</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">年代ごとの満足度分布を比較する</td>
</tr>
</tbody>
</table>
<p><code>地域</code> と <code>満足度</code> には、あえて欠損値も入れています。<br />
あとで、欠損値がある場合の注意点も確認します。</p>


<h2><span id="toc4">1列だけならvalue_counts()で確認する</span></h2>
<p><code>crosstab()</code> は2つの列の組み合わせを見る方法です。</p>
<p>一方、1つの列だけの件数を見たい場合は、<code>value_counts()</code> のほうが簡単です。</p>
<p>まずは、<code>地域</code> 列だけの件数を確認してみます。</p>


<pre class="line-numbers"><code class="language-python">
df[&quot;地域&quot;].value_counts()
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">count</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
  </tbody>
</table>

<p><code>value_counts()</code> では、地域ごとの件数を確認できます。</p>
<p>ただし、これだけでは「地域ごとに購入あり・購入なしが何件あるか」は見えません。</p>
<p><strong>1列だけを見るなら <code>value_counts()</code>、2つの列の組み合わせを見るなら <code>crosstab()</code></strong> と考えるとわかりやすいです。</p>


<h2><span id="toc5">2つの列を組み合わせたクロス集計表を作る</span></h2>
<p>ここからは、<code>pd.crosstab()</code> を使って実際にクロス集計表を作ります。</p>
<p>まずは、<code>地域</code> と <code>購入有無</code> を指定して、地域ごとの購入状況を集計します。</p>
<h3><span id="toc6">地域×購入有無を集計する</span></h3>
<p>「地域ごとに、購入あり・購入なしが何件あるか」を確認する例です。</p>


<pre class="line-numbers"><code class="language-python">
pd.crosstab(df[&quot;地域&quot;], df[&quot;購入有無&quot;])
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
  </tbody>
</table>

<p>この結果を見ると、行に <code>地域</code>、列に <code>購入有無</code> が並びます。</p>
<p>たとえば、このサンプルデータでは、東京は「購入あり」が多く、大阪は「購入なし」が多いことがわかります。</p>
<p><code>crosstab()</code> は元のDataFrameを書き換える処理ではなく、集計結果として新しい表を作る処理です。</p>


<h3><span id="toc7">行と列を入れ替えると見え方が変わる</span></h3>
<p><code>crosstab()</code> では、最初に指定した列が行、2つ目に指定した列が列になります。</p>
<p>次のコードでは、先ほどとは逆に、<code>購入有無</code> を行、<code>地域</code> を列に置いてみます。</p>


<pre class="line-numbers"><code class="language-python">
pd.crosstab(df[&quot;購入有無&quot;], df[&quot;地域&quot;])
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">東京</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">福岡</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">購入あり</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">購入なし</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
  </tbody>
</table>

<p>集計している内容は同じでも、<code>pd.crosstab()</code> に指定する列の順番を変えると、行と列が入れ替わります。</p>
<p>初心者のうちは、「比較したいグループ」を1つ目の引数、つまり行側に置くと読みやすくなります。</p>


<h3><span id="toc8">年代×満足度を集計する</span></h3>
<p>同じ考え方で、<code>年代</code> と <code>満足度</code> の組み合わせも集計できます。</p>
<p>これは、アンケート集計のように「年代ごとに、満足度がどのように分布しているか」を確認する例です。</p>


<pre class="line-numbers"><code class="language-python">
pd.crosstab(df[&quot;年代&quot;], df[&quot;満足度&quot;])
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">低い</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">普通</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">高い</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">40代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
  </tbody>
</table>

<p>この表では、年代ごとに「高い」「普通」「低い」が何件あるかを確認できます。</p>
<p>このサンプルデータでは、20代は「高い」が多く、40代は「低い」が多いことがわかります。</p>
<p>このように、単に満足度全体の件数を見るだけでなく、年代別に分けると傾向が見えやすくなります。<br />
<code>crosstab()</code> は、アンケート集計の入口としても使いやすい方法です。</p>


<h2><span id="toc9">合計行・合計列を追加する</span></h2>
<p>クロス集計表では、行ごとの合計や列ごとの合計も見たいことがあります。</p>
<p>その場合は、<code>margins=True</code> を指定します。</p>


<pre class="line-numbers"><code class="language-python">
pd.crosstab(df[&quot;地域&quot;], df[&quot;購入有無&quot;], margins=True)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">All</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">All</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">9</td>
    </tr>
  </tbody>
</table>

<p><code>margins=True</code> を使うと、合計行・合計列が追加されます。</p>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">指定</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">意味</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>margins=True</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">行方向・列方向の合計を追加する</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>All</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">合計を表す行または列</td>
</tr>
</tbody>
</table>
<p>全体の件数も同時に確認したいときに便利です。</p>


<h2><span id="toc10">件数を割合で表示する</span></h2>
<p>件数だけでなく、割合で見たい場合は <code>normalize</code> を使います。</p>
<p><code>normalize</code> は、<strong>何を分母にして割合を出すか</strong>を指定する引数です。</p>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">指定</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">意味</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">使う場面</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>normalize=True</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">全体に対する割合</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">全体の中でどれくらいかを見たい</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>normalize=&quot;index&quot;</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">行ごとの割合</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">地域ごとの購入有無の割合を見たい</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>normalize=&quot;columns&quot;</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">列ごとの割合</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入有無ごとの地域構成を見たい</td>
</tr>
</tbody>
</table>
<h3><span id="toc11">全体に対する割合を見る</span></h3>
<p>まずは、全体に対する割合を見てみます。</p>


<pre class="line-numbers"><code class="language-python">
# 全体に対する割合を表示する
pd.crosstab(df[&quot;地域&quot;], df[&quot;購入有無&quot;], normalize=True)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1111111111111111</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1111111111111111</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.3333333333333333</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.3333333333333333</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.1111111111111111</td>
    </tr>
  </tbody>
</table>

<p>この表では、全体を1として、それぞれの組み合わせがどれくらいの割合かを表しています。</p>
<p>実務でよく使うのは、次の <code>normalize=&quot;index&quot;</code> です。<br />
たとえば、地域ごとに「購入あり」「購入なし」の割合を見たいときに使います。</p>


<h3><span id="toc12">行ごとの割合を見る</span></h3>
<p><code>normalize=&quot;index&quot;</code> は、行ごとの合計を1として割合を出します。</p>
<p>次の例では、地域ごとに「購入あり」「購入なし」の割合を確認します。</p>


<pre class="line-numbers"><code class="language-python">
# 行ごとの割合を表示する
# ここでは「地域ごとに、購入あり・購入なしの割合」を見る
pd.crosstab(df[&quot;地域&quot;], df[&quot;購入有無&quot;], normalize=&quot;index&quot;)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.5</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
    </tr>
  </tbody>
</table>

<p>この表では、各地域の中で「購入あり」「購入なし」がどれくらいの割合かを確認できます。</p>
<p><code>normalize=&quot;index&quot;</code> は、<strong>行ごとの割合</strong>です。<br />
「年代ごとの満足度割合」を見たい場合も同じ考え方で使えます。</p>


<pre class="line-numbers"><code class="language-python">
# 行ごとの割合を表示する
# ここでは「年代ごとに、満足度の割合」を見る
pd.crosstab(df[&quot;年代&quot;], df[&quot;満足度&quot;], normalize=&quot;index&quot;)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">低い</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">普通</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">高い</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">40代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
    </tr>
  </tbody>
</table>

<p>このコードでは、年代ごとに満足度の割合を見ています。</p>
<p>「20代の中では高いが何割か」「30代の中では普通が何割か」のように、行ごとの分布を確認できます。</p>


<h3><span id="toc13">列ごとの割合を見る</span></h3>
<p><code>normalize=&quot;columns&quot;</code> は、列ごとの合計を1として割合を出します。</p>
<p>次の例では、購入あり・購入なしごとに、地域の構成を確認します。</p>


<pre class="line-numbers"><code class="language-python">
# 列ごとの割合を表示する
# ここでは「購入あり・購入なしごとに、地域の割合」を見る
pd.crosstab(df[&quot;地域&quot;], df[&quot;購入有無&quot;], normalize=&quot;columns&quot;)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.25</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.6</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.75</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.2</td>
    </tr>
  </tbody>
</table>

<p>この表では、列ごとの合計が1になります。</p>
<p><code>normalize=True</code>、<code>normalize=&quot;index&quot;</code>、<code>normalize=&quot;columns&quot;</code> は、分母が違います。<br />
割合を見るときは、「何を1としているのか」を必ず確認しましょう。</p>


<h3><span id="toc14">小数を見やすく丸める</span></h3>
<p>割合表示では、小数が長く表示されることがあります。</p>
<p>最初は割合の意味を理解することが大切ですが、表として見やすくしたい場合は <code>.round()</code> を使うと便利です。</p>


<pre class="line-numbers"><code class="language-python">
# 行ごとの割合を、小数第2位まで表示する
pd.crosstab(df[&quot;地域&quot;], df[&quot;購入有無&quot;], normalize=&quot;index&quot;).round(2)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.5</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
    </tr>
  </tbody>
</table>

<p>この例では、小数第2位まで表示しています。</p>
<p>パーセント表記に整える方法もありますが、この記事では深入りしません。<br />
まずは、<code>normalize</code> の種類によって分母が変わることを理解しておきましょう。</p>


<h2><span id="toc15">欠損値があるときの注意点</span></h2>
<p><code>crosstab()</code> で使う列に欠損値があると、その行は集計表に入らない場合があります。</p>
<p>まずは、どの列に欠損値があるかを確認します。</p>


<pre class="line-numbers"><code class="language-python">
df.isnull().sum()
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">地域</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">年代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品カテゴリ</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">購入有無</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">満足度</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
  </tbody>
</table>

<p>今回のデータでは、<code>地域</code> と <code>満足度</code> に欠損値があります。</p>
<p>ここでは、<code>地域</code> が欠損している行を確認してみます。</p>


<pre class="line-numbers"><code class="language-python">
df[df[&quot;地域&quot;].isnull()]
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">地域</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">年代</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入有無</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">満足度</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">9</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">None</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">None</td>
    </tr>
  </tbody>
</table>

<p>元データは10行あります。</p>


<pre class="line-numbers"><code class="language-python">
len(df)
</code></pre>

<pre class="colab-output"><code>10</code></pre>

<p>次に、<code>地域×購入有無</code> のクロス集計表に合計行・合計列を付けて確認します。</p>


<pre class="line-numbers"><code class="language-python">
pd.crosstab(df[&quot;地域&quot;], df[&quot;購入有無&quot;], margins=True)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">All</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">All</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">9</td>
    </tr>
  </tbody>
</table>

<p>クロス集計表の合計は9件です。</p>
<p>元データは10行ありますが、<code>地域</code> が欠損している行は、東京・大阪・名古屋・福岡のどこにも分類できません。</p>
<p>そのため、<code>地域×購入有無</code> のクロス集計表には入らず、合計が9件になります。</p>
<p>このように、<code>crosstab()</code> で使う列に欠損値があると、集計表の合計件数が元データの行数より少なく見えることがあります。</p>


<p>欠損値を「未回答」として集計したい場合は、<code>fillna()</code> で置き換えてから <code>crosstab()</code> を使います。</p>


<pre class="line-numbers"><code class="language-python">
df_filled = df.copy()
df_filled[&quot;地域&quot;] = df_filled[&quot;地域&quot;].fillna(&quot;未回答&quot;)
df_filled[&quot;満足度&quot;] = df_filled[&quot;満足度&quot;].fillna(&quot;未回答&quot;)

pd.crosstab(df_filled[&quot;地域&quot;], df_filled[&quot;購入有無&quot;], margins=True)
</code></pre>

<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入あり</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">購入なし</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">All</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">未回答</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">福岡</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">All</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">10</td>
    </tr>
  </tbody>
</table>

<p>ここでは、欠損値を「未回答」として扱いました。</p>
<p>ただし、欠損値をすべて機械的に埋めればよいわけではありません。<br />
未回答なのか、入力漏れなのか、分析対象外なのかを考えてから処理しましょう。</p>


<h2><span id="toc16">実務では、件数表から割合表示につなげる</span></h2>
<p><code>crosstab()</code> は、件数表を作って終わりではなく、合計や割合を確認すると傾向が見えやすくなります。</p>
<p>基本の流れは、次のとおりです。</p>
<ol>
<li><code>value_counts()</code> で1列の件数を確認する</li>
<li><code>crosstab()</code> で2つの列の組み合わせを集計する</li>
<li><code>margins=True</code> で合計を見る</li>
<li><code>normalize</code> で割合を見る</li>
</ol>
<p>まずは、<strong>件数表を作る → 合計を見る → 割合を見る</strong> の順番で確認すると、結果を読み取りやすくなります。</p>


<h2><span id="toc17">まとめ</span></h2>
<p>この記事では、pandasの <code>crosstab()</code> を使って、2つの列を組み合わせたクロス集計表を作る方法を解説しました。</p>
<p>ポイントを整理します。</p>
<ul>
<li><code>crosstab()</code> は、2つの列の組み合わせを件数表にしたいときに使う</li>
<li>1列の件数確認なら <code>value_counts()</code> が向いている</li>
<li>2列の組み合わせを見るなら <code>crosstab()</code> がわかりやすい</li>
<li>数値列の合計や平均を出したい場合は、<code>groupby()</code> や <code>pivot_table()</code> が向いている</li>
<li><code>margins=True</code> で合計行・合計列を追加できる</li>
<li><code>normalize</code> を使うと、件数を割合で表示できる</li>
<li><code>normalize=True</code>、<code>normalize=&quot;index&quot;</code>、<code>normalize=&quot;columns&quot;</code> は分母が違う</li>
<li>欠損値がある場合は、集計前に <code>isnull()</code> で確認すると安全</li>
</ul>
<p>なお、<code>values</code> や <code>aggfunc</code> を使う発展的な集計もありますが、初心者はまず「2つの列の件数表を作る」基本形を押さえれば十分です。</p>
<p><code>crosstab()</code> を使えるようになると、単に1列の件数を見るだけでなく、2つの列の関係を表で確認できるようになります。</p>
<p>「地域×購入有無」「年代×満足度」など、2つの列の組み合わせを表で確認できるため、<code>value_counts()</code> の次に覚えておきたいメソッドです。</p>


<h2><span id="toc18">次に読みたい関連記事</span></h2>
<p><code>crosstab()</code> を理解したら、次の記事に進むと、データ分析の流れがつながりやすくなります。</p>
<ul>
<li><p><a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</a><br />
1列の件数集計を復習したい場合におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas groupby×aggの使い方｜基本の集計とaggの書き方を例で解説</a><br />
カテゴリ別に売上合計や平均を出したい場合に役立ちます。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-pivot/">Pandas pivotとpivot_tableの違い｜重複データ対応と集計方法</a><br />
表の形を変えながら、より柔軟に集計したい場合におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-melt/">pandas melt()の使い方｜横持ちデータを縦持ちに変換する方法</a><br />
集計しやすい縦長データに整える方法を学べます。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-isnull/">欠損値を可視化して攻略！Pandas isnullとヒートマップ活用術</a><br />
集計前に欠損値を確認したい場合におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方｜欠損値を0・平均値・中央値・最頻値で埋める方法を初心者向けに解説</a><br />
欠損値をどう扱うかを学びたい場合に役立ちます。</p>
</li>
</ul>


<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc19"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>
<script>Prism.highlightAll();</script>

</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1778426486348" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc20">value_counts()ではなくcrosstab()を使うのはどんなときですか？</span></h3>
<div class="rank-math-answer ">

<p><code>value_counts()</code> は、1つの列の値を数えるときに使います。<br />一方、<code>crosstab()</code> は、2つの列の組み合わせごとの件数を表にするときに使います。<br />たとえば、地域ごとの件数だけなら <code>value_counts()</code>、地域ごとの購入あり・購入なしを見たいなら <code>crosstab()</code> が向いています。</p>

</div>
</div>
<div id="faq-question-1778426494178" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">crosstab()で売上合計や平均値も出せますか？</span></h3>
<div class="rank-math-answer ">

<p>2つの列の件数表を作りたいなら <code>crosstab()</code> がわかりやすいです。<br />一方、カテゴリ別に売上合計や平均値などの数値を集計したい場合は、<code>groupby()</code> が向いています。</p>

</div>
</div>
<div id="faq-question-1778426506834" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">pivot_table()ではなくcrosstab()を使うのはどんなときですか？</span></h3>
<div class="rank-math-answer ">

<p><code>crosstab()</code> は、2つの列の組み合わせを件数表にする用途で使いやすい方法です。<br /><code>pivot_table()</code> は、行・列・値・集計方法を指定して、より柔軟な集計表を作る方法です。<br />初心者はまず、2つの列の件数表なら <code>crosstab()</code>、数値列を使った集計なら <code>pivot_table()</code> と分けて考えると理解しやすいです。</p>

</div>
</div>
<div id="faq-question-1778426520610" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">crosstab()で割合を表示できますか？</span></h3>
<div class="rank-math-answer ">

<p>できます。<br /><code>normalize=True</code>、<code>normalize="index"</code>、<code>normalize="columns"</code> を使うと、件数ではなく割合で表示できます。<br />・<code>normalize=True</code>：全体に対する割合<br /><code>・normalize="index"</code>：行ごとの割合<br /><code>・normalize="columns"</code>：列ごとの割合</p>

</div>
</div>
<div id="faq-question-1778426535394" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">crosstab()で合計行や合計列を追加できますか？</span></h3>
<div class="rank-math-answer ">

<p>できます。<br /><code>margins=True</code> を指定すると、合計行・合計列を追加できます。<br /><code>pd.crosstab(df["地域"], df["購入有無"], margins=True)</code></p>

</div>
</div>
<div id="faq-question-1778426566242" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">valuesやaggfuncも使う必要がありますか？</span></h3>
<div class="rank-math-answer ">

<p>初心者のうちは、まず <code>pd.crosstab(df["行にしたい列"], df["列にしたい列"])</code> の基本形を押さえれば十分です。<br /><code>values</code> や <code>aggfunc</code> を使うと、件数ではなく数値を集計することもできます。<br />ただし、売上合計や平均値のような数値集計を本格的に行う場合は、<code>groupby()</code> や <code>pivot_table()</code> とあわせて学ぶほうが理解しやすいです。</p>

</div>
</div>
<div id="faq-question-1778426586058" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">欠損値がある場合、crosstab()の結果はどうなりますか？</span></h3>
<div class="rank-math-answer ">

<p>欠損値がある行は、集計表に含まれない場合があります。<br />そのため、集計前に <code>df.isnull().sum()</code> で欠損値を確認しておくと安全です。<br />欠損値を「未回答」などのカテゴリとして扱いたい場合は、<code>fillna()</code> で置き換えてから <code>crosstab()</code> を使います。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-crosstab/">pandas crosstab()の使い方｜2つの列をクロス集計・割合表示する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-crosstab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas melt()の使い方｜横持ちデータを縦持ちに変換する方法</title>
		<link>https://pythondatalab.com/pandas-melt/</link>
					<comments>https://pythondatalab.com/pandas-melt/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Mon, 04 May 2026 14:51:44 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2029</guid>

					<description><![CDATA[<p>pandasのmelt()で横持ちデータを縦持ちデータに変換する方法を解説。id_vars、value_varsの違いや、集計・グラフ化しやすい形に整える流れを初心者向けに紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-melt/">pandas melt()の使い方｜横持ちデータを縦持ちに変換する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[

<div class="colab-article">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
  .colab-article pre[class*="language-"],
  .colab-article pre.line-numbers {
    margin: 0 !important;
    padding: 1em;
  }
  .colab-article .colab-output {
    margin: 0.5em 0 1em;
    padding: 0.8em 1em;
    background: #f6f8fa;
    border: 1px solid #e5e7eb;
    overflow-x: auto;
    white-space: pre;
  }
  .colab-article .colab-table-wrap {
    overflow-x: auto;
    margin: 1em 0;
  }
  .colab-article table.wp-block-table {
    width: auto;
    border-collapse: collapse;
  }
  .colab-article .colab-figure {
    margin: 1.2em 0;
    text-align: center;
  }
  .colab-article .colab-figure img {
    max-width: 100%;
    height: auto;
  }
  .colab-article .colab-figure figcaption {
    font-size: 0.9em;
    color: #666;
    margin-top: 0.4em;
  }
</style>

<p>CSVを読み込んだあと、月別の売上や科目別の点数が横に並んでいて、集計しにくいと感じることがあります。</p>
<p>たとえば、次のような表です。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">1月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">2月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">3月</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
</tbody>
</table></div>
<p>このような表は、人間が見るにはわかりやすいです。</p>
<p>しかし、Pandasで月ごとに集計したり、グラフ化したりする場合は、次のように「月」と「売上」を列として持つ形のほうが扱いやすくなります。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
</tbody>
</table></div>
<p>このように、横に広がった列を縦長にまとめるときに使うのが、Pandasの <code>melt()</code> です。</p>
<p>この記事では、<code>melt()</code> の基本、<code>id_vars</code> と <code>value_vars</code> の使い分け、<code>groupby()</code> やグラフ化へつなげる流れを、初心者向けに順番に解説します。</p>


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-9" checked><label class="toc-title" for="toc-checkbox-9">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">melt()はどんな場面で使うのか</a></li><li><a href="#toc3" tabindex="0">横持ちデータと縦持ちデータの違い</a><ol><li><a href="#toc4" tabindex="0">図解：横に並んだ月別列を縦にまとめる</a></li></ol></li><li><a href="#toc5" tabindex="0">サンプルデータを用意する</a></li><li><a href="#toc6" tabindex="0">基本形：melt()で横持ちを縦持ちに変換する</a><ol><li><a href="#toc7" tabindex="0">melt()は3つに分けて考えると迷いにくい</a></li></ol></li><li><a href="#toc8" tabindex="0">melt()後に行数が増える理由</a></li><li><a href="#toc9" tabindex="0">補足：元のindexを残したいときはignore_index=False</a></li><li><a href="#toc10" tabindex="0">id_varsの意味：そのまま残す列</a></li><li><a href="#toc11" tabindex="0">value_varsの意味：縦にまとめる列</a></li><li><a href="#toc12" tabindex="0">var_nameとvalue_nameで列名をわかりやすくする</a><ol><li><a href="#toc13" tabindex="0">value_nameは既存の列名と重ならない名前にする</a></li></ol></li><li><a href="#toc14" tabindex="0">value_varsを省略した場合の注意点</a><ol><li><a href="#toc15" tabindex="0">value_varsを省略すると不要な列まで入る例</a></li></ol></li><li><a href="#toc16" tabindex="0">科目別点数データでもmelt()を使う</a></li><li><a href="#toc17" tabindex="0">melt()した後にgroupby()で集計する</a></li><li><a href="#toc18" tabindex="0">melt()した後にvalue_counts()で件数を確認する</a></li><li><a href="#toc19" tabindex="0">melt()した後に棒グラフで可視化する</a><ol><li><a href="#toc20" tabindex="0">補足：Colabでグラフの日本語ラベルが文字化けするとき</a></li></ol></li><li><a href="#toc21" tabindex="0">melt()とpivot()・pivot_table()の違い</a></li><li><a href="#toc22" tabindex="0">melt()とconcat()・merge()の違い</a></li><li><a href="#toc23" tabindex="0">melt()と他のメソッドを迷ったときの使い分け</a></li><li><a href="#toc24" tabindex="0">よくあるミスと注意点</a></li><li><a href="#toc25" tabindex="0">前処理の流れの中でmelt()を使うタイミング</a><ol><li><a href="#toc26" tabindex="0">補足：CSVで読み込んだデータにもmelt()は使える</a></li></ol></li><li><a href="#toc27" tabindex="0">軽く知っておきたい関連メソッド</a></li><li><a href="#toc28" tabindex="0">まとめ</a></li><li><a href="#toc29" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc30" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc31" tabindex="0">pandas melt()は何をするメソッドですか？</a></li><li><a href="#toc32" tabindex="0">melt()はどんなときに使いますか？</a></li><li><a href="#toc33" tabindex="0">id_varsとvalue_varsの違いは何ですか？</a></li><li><a href="#toc34" tabindex="0">value_varsを省略してもよいですか？</a></li><li><a href="#toc35" tabindex="0">variable列とvalue列は何を意味しますか？</a></li><li><a href="#toc36" tabindex="0">melt()後に行数が増えるのはなぜですか？</a></li><li><a href="#toc37" tabindex="0">melt()とpivot()の違いは何ですか？</a></li><li><a href="#toc38" tabindex="0">melt()したあとにgroupby()やグラフ化はできますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
<li><code>melt()</code> が何をするメソッドか</li>
<li>横持ちデータと縦持ちデータの違い</li>
<li><code>id_vars</code> と <code>value_vars</code> の使い分け</li>
<li><code>var_name</code> と <code>value_name</code> で列名を整える方法</li>
<li><code>melt()</code> 後に行数が増える理由</li>
<li><code>value_vars</code> を省略するときの注意点</li>
<li><code>melt()</code> 後に <code>groupby()</code> や棒グラフへつなげる流れ</li>
</ul>
<p>この記事のゴールは、横に広がったDataFrameを、集計・可視化しやすい縦持ちデータに変換できるようになることです。</p>
<p>発展的な内容や環境差が出やすい内容は、本文の後半で補足として扱います。</p>

<h2><span id="toc2">melt()はどんな場面で使うのか</span></h2>
<p><code>melt()</code> は、次のように「同じ種類の情報が複数の列に分かれている」ときに役立ちます。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">データの例</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">横に並んでいる列</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">melt後に作りたい列</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">月別売上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>月</code>, <code>売上</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">科目別点数</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>国語</code>, <code>数学</code>, <code>英語</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>科目</code>, <code>点数</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品別数量</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>ノートPC</code>, <code>マウス</code>, <code>キーボード</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>商品</code>, <code>数量</code></td>
</tr>
</tbody>
</table></div>
<p>横持ちデータは人間が見る表としては便利です。</p>
<p>一方で、Pandasで集計・条件抽出・グラフ化をする場合は、項目名と値が列として分かれている縦持ちデータのほうが扱いやすいことがあります。</p>
<p>迷ったときは、次のように判断すると整理しやすいです。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">状況</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">melt()を使う？</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">理由</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code> のように同じ種類の列が横に並んでいる</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使う</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>月</code> 列と <code>売上</code> 列にまとめると集計しやすい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>国語</code>, <code>数学</code>, <code>英語</code> のように科目が列になっている</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使う</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>科目</code> 列と <code>点数</code> 列にまとめられる</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">すでに <code>月</code> 列と <code>売上</code> 列がある</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使わない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">すでに縦持ちなので変換不要</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">表として見やすく表示したいだけ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">無理に使わない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">横持ちのほうが見やすい場合もある</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">列名を変えたいだけ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使わない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>rename()</code> のほうが目的に合う</td>
</tr>
</tbody>
</table></div>
<p>つまり、<code>melt()</code> は「横に並んだ同じ種類の列を、1つの項目列と1つの値列にまとめたい」ときに使います。</p>

<h2><span id="toc3">横持ちデータと縦持ちデータの違い</span></h2>
<p><code>melt()</code> を理解するには、まず横持ちデータと縦持ちデータの違いを押さえるとわかりやすいです。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">形式</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">特徴</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">向いている場面</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">横持ちデータ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">月・科目・商品などが列として横に並ぶ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">表として眺める、比較表として見る</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦持ちデータ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">月・科目・商品などを1つの列にまとめる</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">集計、条件抽出、グラフ化</td>
</tr>
</tbody>
</table></div>
<p><code>melt()</code> は、横持ちデータを縦持ちデータに変換するためのメソッドです。</p>
<p>ポイントは、<strong>列名として横に並んでいた情報を、1つの列の値として縦に並べ直すこと</strong>です。</p>

<h3><span id="toc4">図解：横に並んだ月別列を縦にまとめる</span></h3>
<p><figure class="colab-figure"><img decoding="async" alt="pandas melt()で横持ちデータを縦持ちデータに変換する図解" loading="lazy" src="https://pythondatalab.com/wp-content/uploads/2026/05/melt_wide_to_long_diagram.png"/><figcaption>pandas melt()で横持ちデータを縦持ちデータに変換する図解</figcaption></figure></p>
<p>図のように、<code>1月</code>、<code>2月</code>、<code>3月</code> のように横に並んだ列を、<code>月</code> 列と <code>売上</code> 列にまとめます。</p>
<p>このとき、<code>社員名</code> のように残したい列は <code>id_vars</code> に指定します。</p>
<p>一方で、<code>1月</code>、<code>2月</code>、<code>3月</code> のように縦へまとめたい列は <code>value_vars</code> に指定します。</p>
<p><code>melt()</code> は売上を合計する処理ではありません。集計やグラフ化をしやすい形に並べ直す前処理です。</p>

<h2><span id="toc5">サンプルデータを用意する</span></h2>
<p>ここでは、社員ごとの月別売上データを使います。</p>
<p><code>1月</code>、<code>2月</code>、<code>3月</code> が横に並んでいるため、月別に集計したいときには少し扱いにくい形です。</p>

<pre class="line-numbers"><code class="language-python">import pandas as pd

df = pd.DataFrame({
    &quot;社員ID&quot;: [&quot;E001&quot;, &quot;E002&quot;, &quot;E003&quot;],
    &quot;社員名&quot;: [&quot;佐藤&quot;, &quot;鈴木&quot;, &quot;田中&quot;],
    &quot;部署&quot;: [&quot;営業部&quot;, &quot;営業部&quot;, &quot;企画部&quot;],
    &quot;1月&quot;: [120000, 98000, 150000],
    &quot;2月&quot;: [135000, 110000, 142000],
    &quot;3月&quot;: [128000, 105000, 160000]
})

df</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">1月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">2月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">3月</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p>このデータでは、<code>社員ID</code>、<code>社員名</code>、<code>部署</code> は社員を説明する列です。</p>
<p>一方で、<code>1月</code>、<code>2月</code>、<code>3月</code> は、月別の売上を表す列です。</p>
<p>今回目指す形は、次のとおりです。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">変換前</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">変換後</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員ID</code>, <code>社員名</code>, <code>部署</code>, <code>1月</code>, <code>2月</code>, <code>3月</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員ID</code>, <code>社員名</code>, <code>部署</code>, <code>月</code>, <code>売上</code></td>
</tr>
</tbody>
</table></div>
<p>つまり、社員を説明する列は残し、月別売上の列だけを縦にまとめます。</p>

<h2><span id="toc6">基本形：melt()で横持ちを縦持ちに変換する</span></h2>
<p><code>melt()</code> の基本形は次のとおりです。</p>
<pre class="line-numbers"><code class="language-python">df.melt(
    id_vars=[残す列],
    value_vars=[縦にまとめる列],
    var_name="項目列の名前",
    value_name="値列の名前"
)
</code></pre>
<p>今回の場合は、社員情報を残し、月別売上の列を縦にまとめます。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">引数</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">今回の指定</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">意味</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員ID</code>, <code>社員名</code>, <code>部署</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">そのまま残す列</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦にまとめる列</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>var_name</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>月</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">元の列名を入れる列名</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_name</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>売上</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">元の値を入れる列名</td>
</tr>
</tbody>
</table></div>

<h3><span id="toc7">melt()は3つに分けて考えると迷いにくい</span></h3>
<p><code>melt()</code> では、最初に次の3つを決めると迷いにくくなります。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">決めること</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">指定する引数</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">今回の例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">そのまま残す列はどれか</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員ID</code>, <code>社員名</code>, <code>部署</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦にまとめる列はどれか</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">melt後の列名を何にするか</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>var_name</code>, <code>value_name</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>月</code>, <code>売上</code></td>
</tr>
</tbody>
</table></div>
<p>初心者が一番迷いやすいのは、<code>id_vars</code> と <code>value_vars</code> の分け方です。</p>
<p>まずは「社員名や部署のように説明として残す列」と「1月・2月・3月のように縦へまとめる列」を分けて考えると、コードを書きやすくなります。</p>

<pre class="line-numbers"><code class="language-python">sales_long = df.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;],
    value_vars=[&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;
)

sales_long</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p><code>1月</code>、<code>2月</code>、<code>3月</code> の列が、<code>月</code> 列にまとまりました。</p>
<p>それぞれの金額は、<code>売上</code> 列に入っています。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">元の列</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">melt後</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員ID</code>, <code>社員名</code>, <code>部署</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">そのまま残る</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>月</code> 列に入る</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">各月の売上金額</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>売上</code> 列に入る</td>
</tr>
</tbody>
</table></div>
<p><code>melt()</code> では、まず「残す列」と「縦にまとめる列」を分けるのがポイントです。</p>

<h2><span id="toc8">melt()後に行数が増える理由</span></h2>
<p><code>melt()</code> を初めて使うと、行数が増えることに驚くかもしれません。</p>
<p>今回のデータは、変換前は3人分なので3行です。</p>
<p>しかし、1人につき <code>1月</code>、<code>2月</code>、<code>3月</code> の3つの売上があるため、<code>melt()</code> 後は次のように行数が増えます。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">変換前</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">変換後</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3人 × 1行 = 3行</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3人 × 3か月 = 9行</td>
</tr>
</tbody>
</table></div>
<p><code>melt()</code> は、データを消しているのではありません。</p>
<p>横に並んでいた値を、縦に並べ直しているため、行数が増えるのは自然な動きです。</p>

<pre class="line-numbers"><code class="language-python">print(&quot;変換前の行数:&quot;, len(df))
print(&quot;変換後の行数:&quot;, len(sales_long))</code></pre>
<pre class="colab-output">変換前の行数: 3
変換後の行数: 9
</pre>
<p>このように、<code>melt()</code> 後は「元の行数 × 縦にまとめた列数」に近い行数になります。</p>
<p>今回であれば、3人 × 3か月なので9行です。</p>

<h2><span id="toc9">補足：元のindexを残したいときはignore_index=False</span></h2>
<p><code>melt()</code> は、通常は変換後に新しい連番indexを付けます。</p>
<p>多くの場合はそのままで問題ありません。</p>
<p>ただし、元の行番号やindexを確認しながら変換結果を見たいときは、<code>ignore_index=False</code> を指定できます。</p>
<p>初心者のうちは必須ではありませんが、<code>melt()</code> 後に「元のindexはどうなるのか」で迷ったときに知っておくと便利です。</p>

<pre class="line-numbers"><code class="language-python">df.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;],
    value_vars=[&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;,
    ignore_index=False
)</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p><code>ignore_index=False</code> を指定すると、変換前のindexが残ります。</p>
<p>今回の例では、元データの0行目、1行目、2行目が、それぞれ月の数だけ繰り返されます。</p>
<p>ただし、通常の分析では新しい連番indexで問題ないことが多いため、最初は省略して構いません。</p>

<h2><span id="toc10">id_varsの意味：そのまま残す列</span></h2>
<p><code>id_vars</code> には、melt後もそのまま残したい列を指定します。</p>
<p>今回の例では、次の列です。</p>
<ul>
<li><code>社員ID</code></li>
<li><code>社員名</code></li>
<li><code>部署</code></li>
</ul>
<p>初心者向けに言うと、<code>id_vars</code> は<strong>縦にまとめない列</strong>です。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">列</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">指定先</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">理由</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員ID</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">社員を識別するため</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員名</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">誰の売上かを残すため</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>部署</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">部署別集計に使えるため</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦にまとめたい月別売上だから</td>
</tr>
</tbody>
</table></div>
<p><code>id_vars</code> に入れない列は、結果に残らないことがあります。</p>
<p>後で使いたい列は、<code>id_vars</code> に入れておきましょう。</p>

<pre class="line-numbers"><code class="language-python">df.melt(
    id_vars=[&quot;社員名&quot;],
    value_vars=[&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;
)</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p>この例では、<code>社員名</code> だけを <code>id_vars</code> にしたため、<code>社員ID</code> と <code>部署</code> は結果に残りません。</p>
<p>あとで部署別に集計したいなら、<code>部署</code> も <code>id_vars</code> に含める必要があります。</p>

<h2><span id="toc11">value_varsの意味：縦にまとめる列</span></h2>
<p><code>value_vars</code> には、縦にまとめたい列を指定します。</p>
<p>月別売上データなら、<code>1月</code>、<code>2月</code>、<code>3月</code> が該当します。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">引数</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">役割</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">今回の例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">そのまま残す列</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>社員ID</code>, <code>社員名</code>, <code>部署</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_vars</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦にまとめる列</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code></td>
</tr>
</tbody>
</table></div>
<p><code>value_vars</code> は、「この列たちを1つの項目列と値列にまとめたい」と指定する場所です。</p>

<pre class="line-numbers"><code class="language-python">df.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;],
    value_vars=[&quot;1月&quot;, &quot;3月&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;
)</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p>この例では、<code>value_vars</code> に <code>1月</code> と <code>3月</code> だけを指定しています。</p>
<p>そのため、<code>2月</code> は結果に含まれません。</p>
<p>分析対象にしたい列だけを選んで縦にまとめられるのが、<code>value_vars</code> の便利な点です。</p>

<h2><span id="toc12">var_nameとvalue_nameで列名をわかりやすくする</span></h2>
<p><code>var_name</code> と <code>value_name</code> を指定しない場合、melt後の列名は <code>variable</code> と <code>value</code> になります。</p>

<pre class="line-numbers"><code class="language-python">df.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;],
    value_vars=[&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;]
)</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">variable</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">value</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p>このままでも処理はできますが、<code>variable</code> と <code>value</code> だけでは、何を表している列なのかがわかりにくいです。</p>
<p>そこで、次のように指定します。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">引数</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">意味</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">今回の指定</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>var_name</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">元の列名を入れる列の名前</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>月</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_name</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">元の値を入れる列の名前</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>売上</code></td>
</tr>
</tbody>
</table></div>
<p>実務でも記事でも、<code>var_name</code> と <code>value_name</code> は指定しておくと読みやすくなります。</p>

<pre class="line-numbers"><code class="language-python">sales_long = df.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;],
    value_vars=[&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;
)

sales_long</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p><code>variable</code> と <code>value</code> ではなく、<code>月</code> と <code>売上</code> という列名になりました。</p>
<p>あとで <code>groupby("月")</code> や <code>sales_long["売上"]</code> のように書くときも、意味が読み取りやすくなります。</p>

<h3><span id="toc13">value_nameは既存の列名と重ならない名前にする</span></h3>
<p><code>value_name</code> には、melt後の値列の名前を指定します。</p>
<p>この名前は、元のDataFrameにすでにある列名と重ならないようにするのが安全です。</p>
<p>たとえば、元データにすでに <code>売上</code> という列があるのに、<code>value_name="売上"</code> と指定すると、列名の重複やエラーの原因になることがあります。</p>
<p>今回のサンプルでは、元データに <code>売上</code> 列はなく、<code>1月</code>、<code>2月</code>、<code>3月</code> の値をまとめた列として新しく <code>売上</code> という名前を付けています。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">状況</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">おすすめ</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">元データに <code>売上</code> 列がない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_name="売上"</code> でよい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">元データにすでに <code>売上</code> 列がある</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_name="月別売上"</code> など別名にする</td>
</tr>
</tbody>
</table></div>
<p>細かい点ですが、実務データでは列名が増えやすいため、melt後の列名は元の列名と重ならないように確認しておきましょう。</p>

<h2><span id="toc14">value_varsを省略した場合の注意点</span></h2>
<p><code>value_vars</code> は省略できます。</p>
<p>ただし、省略すると、<code>id_vars</code> 以外の列がすべて縦にまとめられます。</p>

<pre class="line-numbers"><code class="language-python">df.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;
)</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p>今回のデータでは、<code>id_vars</code> 以外が <code>1月</code>、<code>2月</code>、<code>3月</code> だけなので問題ありません。</p>
<p>しかし、実際のCSVには <code>備考</code>、<code>登録日</code>、<code>メモ</code> のような列が含まれることがあります。</p>
<p>その場合、<code>value_vars</code> を省略すると、意図しない列まで縦にまとめられる可能性があります。</p>
<p>初心者のうちは、<code>value_vars</code> を明示するほうが安全です。</p>

<h3><span id="toc15">value_varsを省略すると不要な列まで入る例</span></h3>
<p>次のように、元データに <code>備考</code> 列があるケースを考えます。</p>
<p><code>備考</code> は売上ではないため、本来は <code>月</code> や <code>売上</code> にまとめたくない列です。</p>

<pre class="line-numbers"><code class="language-python">df_extra = df.copy()
df_extra[&quot;備考&quot;] = [&quot;重点顧客&quot;, &quot;通常&quot;, &quot;確認中&quot;]

df_extra</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">1月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">2月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">3月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">備考</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">重点顧客</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">通常</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">確認中</td>
</tr>
</tbody>
</table></div>
<p>この状態で <code>value_vars</code> を省略すると、<code>id_vars</code> 以外の列がすべて縦にまとめられます。</p>
<p>つまり、<code>1月</code>、<code>2月</code>、<code>3月</code> だけでなく、<code>備考</code> まで <code>月</code> 列に入ってしまいます。</p>

<pre class="line-numbers"><code class="language-python">df_extra.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;
)</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">9</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">備考</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">重点顧客</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">備考</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">通常</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">11</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">備考</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">確認中</td>
</tr>
</tbody>
</table></div>
<p><code>備考</code> は売上ではないので、この結果は分析しにくい形です。</p>
<p>このようなミスを防ぐには、縦にまとめたい列を <code>value_vars</code> で明示します。</p>

<pre class="line-numbers"><code class="language-python">df_extra.melt(
    id_vars=[&quot;社員ID&quot;, &quot;社員名&quot;, &quot;部署&quot;, &quot;備考&quot;],
    value_vars=[&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;],
    var_name=&quot;月&quot;,
    value_name=&quot;売上&quot;
)</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">備考</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">重点顧客</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">通常</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">確認中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">重点顧客</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">通常</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">確認中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">重点顧客</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">通常</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">確認中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<p>このように、<code>value_vars</code> を指定すると、売上に関係する月別列だけを縦にまとめられます。</p>
<p>実際のCSVでは、メモ列、登録日、区分、備考などが混ざっていることがあります。初心者のうちは、<code>value_vars</code> を省略せずに明示するほうが安全です。</p>

<h2><span id="toc16">科目別点数データでもmelt()を使う</span></h2>
<p>月別売上だけでなく、科目別点数のようなデータでも <code>melt()</code> は使えます。</p>
<p>ここでは、<code>国語</code>、<code>数学</code>、<code>英語</code> が横に並んだデータを、<code>科目</code> 列と <code>点数</code> 列に変換します。</p>

<pre class="line-numbers"><code class="language-python">score_df = pd.DataFrame({
    &quot;生徒ID&quot;: [&quot;S001&quot;, &quot;S002&quot;, &quot;S003&quot;],
    &quot;氏名&quot;: [&quot;山田&quot;, &quot;田中&quot;, &quot;伊藤&quot;],
    &quot;クラス&quot;: [&quot;A&quot;, &quot;A&quot;, &quot;B&quot;],
    &quot;国語&quot;: [82, 75, 90],
    &quot;数学&quot;: [70, 88, 95],
    &quot;英語&quot;: [78, 84, 92]
})

score_df</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">生徒ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">氏名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">クラス</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">国語</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">数学</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">英語</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">山田</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">82</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">70</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">78</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">75</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">88</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">84</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">伊藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">90</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">95</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">92</td>
</tr>
</tbody>
</table></div>
<pre class="line-numbers"><code class="language-python">score_long = score_df.melt(
    id_vars=[&quot;生徒ID&quot;, &quot;氏名&quot;, &quot;クラス&quot;],
    value_vars=[&quot;国語&quot;, &quot;数学&quot;, &quot;英語&quot;],
    var_name=&quot;科目&quot;,
    value_name=&quot;点数&quot;
)

score_long</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">生徒ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">氏名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">クラス</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">科目</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">点数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">山田</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">国語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">82</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">国語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">75</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">伊藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">国語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">90</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">山田</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数学</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">70</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数学</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">88</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">伊藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数学</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">95</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">山田</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">英語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">78</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">英語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">84</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">S003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">伊藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">英語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">92</td>
</tr>
</tbody>
</table></div>
<p><code>国語</code>、<code>数学</code>、<code>英語</code> が <code>科目</code> 列にまとまり、点数は <code>点数</code> 列に入りました。</p>
<p>この形にしておくと、科目ごとの平均点を出しやすくなります。</p>

<pre class="line-numbers"><code class="language-python">score_long.groupby(&quot;科目&quot;, as_index=False)[&quot;点数&quot;].mean()</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">科目</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">点数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">国語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">82.333333</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数学</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">84.333333</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">英語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">84.666667</td>
</tr>
</tbody>
</table></div>
<p>この例では、<code>melt()</code> で科目ごとに集計しやすい形へ変換し、その後に <code>groupby()</code> で平均点を計算しています。</p>

<h2><span id="toc17">melt()した後にgroupby()で集計する</span></h2>
<p><code>melt()</code> のメリットは、変換後に <code>groupby()</code> へつなげやすいことです。</p>
<p>先ほど作成した <code>sales_long</code> を使って、月ごとの売上合計を確認してみます。</p>

<pre class="line-numbers"><code class="language-python">monthly_sales = sales_long.groupby(&quot;月&quot;, as_index=False)[&quot;売上&quot;].sum()

monthly_sales</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">368000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">387000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">393000</td>
</tr>
</tbody>
</table></div>
<p>縦持ちにしておくと、<code>月</code> という列を基準に集計できます。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">月ごとの売上合計</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>groupby("月")["売上"].sum()</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">部署ごとの売上合計</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>groupby("部署")["売上"].sum()</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">社員ごとの平均売上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>groupby("社員名")["売上"].mean()</code></td>
</tr>
</tbody>
</table></div>
<p><code>melt()</code> は集計の前処理、<code>groupby()</code> は集計本体と考えると整理しやすいです。</p>

<h2><span id="toc18">melt()した後にvalue_counts()で件数を確認する</span></h2>
<p><code>melt()</code> 後のカテゴリ列は、<code>value_counts()</code> でも扱いやすくなります。</p>
<p>たとえば、科目別点数データで、科目ごとの行数を確認してみます。</p>

<pre class="line-numbers"><code class="language-python">score_long[&quot;科目&quot;].value_counts()</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">count</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">科目</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">国語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数学</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">英語</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
</tr>
</tbody>
</table></div>
<p>この例では、各生徒に3科目分のデータがあるため、各科目が同じ件数になります。</p>
<p>実務では、商品名、カテゴリ、月、地域などを縦持ちにしておくと、カテゴリごとの件数確認がしやすくなります。</p>

<h2><span id="toc19">melt()した後に棒グラフで可視化する</span></h2>
<p>縦持ちデータに変換すると、Matplotlibの棒グラフにもつなげやすくなります。</p>
<p>ここでは、月ごとの売上合計を棒グラフで表示します。</p>
<p>Google Colabでは、日本語の軸ラベルやタイトルが文字化けする場合があります。この記事では <code>melt()</code> 後にグラフ化へ進む流れを確認することを目的にしているため、基本コードでは英語ラベルを使います。日本語で表示したい場合の対処法は、この後の補足で紹介します。</p>

<pre class="line-numbers"><code class="language-python">import matplotlib.pyplot as plt

monthly_sales = sales_long.groupby(&quot;月&quot;, as_index=False)[&quot;売上&quot;].sum()

plt.figure(figsize=(6, 4))
plt.bar(monthly_sales[&quot;月&quot;], monthly_sales[&quot;売上&quot;])
plt.xlabel(&quot;Month&quot;)
plt.ylabel(&quot;Sales&quot;)
plt.title(&quot;Monthly Sales&quot;)
plt.show()</code></pre>
<pre class="colab-output">/usr/local/lib/python3.12/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26376 (\N{CJK UNIFIED IDEOGRAPH-6708}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
</pre>
<figure class="colab-figure">
  <img decoding="async" src="images/figure1.png" alt="melt()で縦持ちに変換したデータを月別売上で集計した棒グラフ" loading="lazy">
  <figcaption>melt()で縦持ちに変換したデータを月別売上で集計した棒グラフ</figcaption>
</figure>
<p>流れは次のとおりです。</p>
<ol>
<li>横持ちデータを用意する</li>
<li><code>melt()</code> で縦持ちデータに変換する</li>
<li><code>groupby()</code> で月別に集計する</li>
<li>Matplotlibで棒グラフにする</li>
</ol>
<p><code>melt()</code> はグラフを描くメソッドではありません。</p>
<p>ただし、グラフ化しやすいデータの形を作る前処理として役立ちます。</p>

<h3><span id="toc20">補足：Colabでグラフの日本語ラベルが文字化けするとき</span></h3>
<p>Google ColabでMatplotlibのグラフを描くと、日本語のタイトルや軸ラベルが文字化けすることがあります。</p>
<p>この記事では、まず <code>melt()</code> の流れを理解しやすくするため、基本のグラフでは英語ラベルを使いました。</p>
<p>日本語で表示したい場合は、次のように <code>japanize-matplotlib</code> を使う方法があります。</p>

<pre class="line-numbers"><code class="language-python"># Colabで日本語ラベルを使いたい場合
!pip -q install japanize-matplotlib

import matplotlib.pyplot as plt
import japanize_matplotlib

monthly_sales = sales_long.groupby(&quot;月&quot;, as_index=False)[&quot;売上&quot;].sum()

plt.figure(figsize=(6, 4))
plt.bar(monthly_sales[&quot;月&quot;], monthly_sales[&quot;売上&quot;])
plt.xlabel(&quot;月&quot;)
plt.ylabel(&quot;売上&quot;)
plt.title(&quot;月別売上&quot;)
plt.show()</code></pre>
<p>この補足は、グラフの表示環境に関する内容です。</p>
<p><code>melt()</code> の使い方そのものは、英語ラベルでも日本語ラベルでも変わりません。</p>

<h2><span id="toc21">melt()とpivot()・pivot_table()の違い</span></h2>
<p><code>melt()</code>、<code>pivot()</code>、<code>pivot_table()</code> は、どれもDataFrameの形を変える場面で出てきます。</p>
<p>違いは、変換する向きと集計の有無です。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">メソッド</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">主な役割</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">変換の向き</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">集計</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>melt()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">横に並んだ列を縦にまとめる</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">横持ち → 縦持ち</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">しない</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>pivot()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦長データを横に広げる</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦持ち → 横持ち</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">しない</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>pivot_table()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">集計しながら横に広げる</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦持ち → 集計表</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">する</td>
</tr>
</tbody>
</table></div>
<p><code>melt()</code> と <code>pivot()</code> は、ざっくり言うと逆方向の処理です。</p>

<pre class="line-numbers"><code class="language-python"># melt()で作った縦持ちデータ
sales_long</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">部署</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">7</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">営業部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">E003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">企画部</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3月</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
</tbody>
</table></div>
<pre class="line-numbers"><code class="language-python"># 縦持ちデータを、社員名×月の横持ちデータに戻す例
sales_pivot = sales_long.pivot(
    index=&quot;社員名&quot;,
    columns=&quot;月&quot;,
    values=&quot;売上&quot;
)

sales_pivot</code></pre>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">1月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">2月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">3月</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">社員名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">佐藤</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">135000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">128000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">田中</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">150000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">142000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">160000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">鈴木</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">98000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">110000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">105000</td>
</tr>
</tbody>
</table></div>
<p>この記事では <code>melt()</code> を中心に扱っています。</p>
<p><code>pivot()</code> や <code>pivot_table()</code> の詳しい使い方は、集計表を作る場面で学ぶと理解しやすいです。</p>

<h2><span id="toc22">melt()とconcat()・merge()の違い</span></h2>
<p><code>melt()</code> は、1つのDataFrameの形を変える処理です。</p>
<p><code>concat()</code> や <code>merge()</code> は、複数のDataFrameを結合する処理です。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">メソッド</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">目的</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>melt()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1つのDataFrameの形を変える</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">月別列を、月列と売上列に変換する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>concat()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">複数のDataFrameを上下・左右に結合する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月CSV、2月CSV、3月CSVを縦に結合する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>merge()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">キー列を使って別表を結合する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上データに社員マスタを結合する</td>
</tr>
</tbody>
</table></div>
<p>「列を縦にまとめたい」のか、「別のDataFrameをくっつけたい」のかで使い分けましょう。</p>

<h2><span id="toc23">melt()と他のメソッドを迷ったときの使い分け</span></h2>
<p><code>melt()</code> は便利ですが、すべてのデータ整形に使うメソッドではありません。</p>
<p>目的別に整理すると、次のようになります。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">使うメソッド</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">横に並んだ月・科目・商品列を縦にまとめたい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>melt()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>1月</code>, <code>2月</code>, <code>3月</code> → <code>月</code>, <code>売上</code></td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦持ちデータを横持ちの表に戻したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>pivot()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>月</code> 列を <code>1月</code>, <code>2月</code>, <code>3月</code> の列に戻す</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">集計しながら横持ちの表を作りたい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>pivot_table()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">部署×月の売上合計表を作る</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">複数のDataFrameを上下に結合したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>concat()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1月CSV、2月CSV、3月CSVを縦に結合する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">別表の情報をキーで結合したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>merge()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上データに社員マスタを結合する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">列名だけを変更したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>rename()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>氏名</code> を <code>社員名</code> に変更する</td>
</tr>
</tbody>
</table></div>
<p>検索していると、<code>melt()</code>、<code>pivot()</code>、<code>concat()</code>、<code>merge()</code> がまとめて出てくることがあります。</p>
<p>しかし、<code>melt()</code> の役割はあくまで、<strong>1つのDataFrameの中で、横に並んだ列を縦にまとめること</strong>です。</p>
<p>「列を縦にまとめたいのか」「表を結合したいのか」「列名を変えたいだけなのか」を先に分けると、使うメソッドを選びやすくなります。</p>

<h2><span id="toc24">よくあるミスと注意点</span></h2>
<p><code>melt()</code> で初心者がつまずきやすい点を整理します。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">よくあるミス</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">対策</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>melt()</code> が集計する処理だと思う</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>melt()</code> は形を変えるだけ。集計は <code>groupby()</code> などで行う</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code> と <code>value_vars</code> を逆にする</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>id_vars</code> は残す列、<code>value_vars</code> は縦にまとめる列</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>variable</code> と <code>value</code> の意味がわからない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>var_name</code> と <code>value_name</code> を指定する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_vars</code> を省略して意図しない列まで変換する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">初心者のうちは <code>value_vars</code> を明示する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>value_name</code> を既存の列名と重ねてしまう</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">元データにない列名を付ける</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>melt()</code> 後にindexが変わって驚く</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">通常は新しいindexで問題ない。必要なら <code>ignore_index=False</code> を使う</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">列名変更やDataFrame結合にもmelt()を使おうとする</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">列名変更は <code>rename()</code>、結合は <code>concat()</code> / <code>merge()</code> を使う</td>
</tr>
</tbody>
</table></div>
<p>特に大事なのは、横持ちデータが悪いわけではないという点です。</p>
<p>表として見るだけなら、横持ちのままで問題ありません。</p>
<p>一方で、集計・条件抽出・グラフ化をしやすくしたい場合は、<code>melt()</code> で縦持ちにすることを検討するとよいです。</p>

<h2><span id="toc25">前処理の流れの中でmelt()を使うタイミング</span></h2>
<p><code>melt()</code> は、集計や可視化の直前に使うことが多いです。</p>
<p>流れとしては、次のように考えると自然です。</p>
<ol>
<li><code>read_csv()</code> でCSVを読み込む</li>
<li><code>head()</code> や <code>info()</code> でデータを確認する</li>
<li>欠損値、重複、型、列名を整える</li>
<li>横持ちデータなら <code>melt()</code> で縦持ちに変換する</li>
<li><code>groupby()</code> や <code>value_counts()</code> で集計する</li>
<li>Matplotlibでグラフ化する</li>
</ol>
<p>月別売上、科目別点数、商品別数量のように、同じ種類の項目が横に並んでいるデータでは、<code>melt()</code> を検討するとよいです。</p>

<h3><span id="toc26">補足：CSVで読み込んだデータにもmelt()は使える</span></h3>
<p>実際の分析では、手入力のサンプルデータではなく、CSVファイルを読み込んだDataFrameに対して <code>melt()</code> を使うこともあります。</p>
<p>考え方は同じです。</p>
<ul>
<li>残す列を <code>id_vars</code> に指定する</li>
<li>縦にまとめる列を <code>value_vars</code> に指定する</li>
<li>元の列名を入れる列名を <code>var_name</code> で決める</li>
<li>値を入れる列名を <code>value_name</code> で決める</li>
</ul>
<p>CSVを読み込んだ直後は、まず <code>head()</code> や <code>info()</code> で列名を確認してから、<code>melt()</code> を使うと安全です。</p>

<pre class="line-numbers"><code class="language-python"># 例：CSVを読み込んだあとにmelt()する場合
# df_csv = pd.read_csv(&quot;sales.csv&quot;)

# 実際には、CSVの列名に合わせて id_vars と value_vars を指定します。
# long_df = df_csv.melt(
#     id_vars=&quot;商品名&quot;,
#     value_vars=[&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;],
#     var_name=&quot;月&quot;,
#     value_name=&quot;販売数&quot;
# )</code></pre>
<h2><span id="toc27">軽く知っておきたい関連メソッド</span></h2>
<p><code>melt()</code> に似た変形処理として、<code>stack()</code>、<code>unstack()</code>、<code>wide_to_long()</code> があります。</p>
<p>ただし、初心者のうちは、まず <code>melt()</code> の基本を理解すれば十分です。</p>
<div class="colab-table-wrap"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">メソッド</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">ざっくりした役割</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd; font-weight: 600; background: #f6f8fa;">この記事での扱い</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>melt()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">横持ちを縦持ちに変換する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">中心</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>stack()</code> / <code>unstack()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">インデックスを使って形を変える</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">軽く触れるだけ</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>wide_to_long()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">規則的な列名をもとに縦長へ変換する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">発展</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>pivot()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">縦持ちを横持ちへ戻す</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">比較対象</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>pivot_table()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">集計しながら横持ちへ変換する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">比較対象</td>
</tr>
</tbody>
</table></div>
<p>最初からすべて覚える必要はありません。まずは、<code>melt()</code> を「横に増えた列を縦にまとめる基本メソッド」として理解しましょう。</p>

<h2><span id="toc28">まとめ</span></h2>
<p>この記事では、Pandasの <code>melt()</code> を使って、横持ちデータを縦持ちデータへ変換する方法を解説しました。</p>
<p>ポイントは次のとおりです。</p>
<ul>
<li><code>melt()</code> は、横に広がった列を縦長にまとめるメソッド</li>
<li><code>id_vars</code> は、そのまま残す列</li>
<li><code>value_vars</code> は、縦にまとめる列</li>
<li><code>var_name</code> は、元の列名を入れる列の名前</li>
<li><code>value_name</code> は、元の値を入れる列の名前</li>
<li><code>value_vars</code> を省略すると、意図しない列まで縦にまとめることがある</li>
<li><code>melt()</code> 後は、横に並んでいた値を縦に並べ直すため、行数が増えることがある</li>
<li><code>melt()</code> は集計ではなく、集計・可視化しやすい形へ整える前処理</li>
<li><code>melt()</code> と <code>pivot()</code> は、変換の向きが逆</li>
<li><code>melt()</code> 後は、<code>groupby()</code>、<code>value_counts()</code>、Matplotlibにつなげやすい</li>
</ul>
<p>月別売上、科目別点数、商品別数量のように、同じ種類の項目が横に並んでいる表では、<code>melt()</code> が役立ちます。</p>
<p>横持ちの表を見て「集計しにくい」「グラフにしにくい」と感じたら、まず <code>melt()</code> で縦持ちにできないかを考えてみましょう。</p>

<h2><span id="toc29">次に読みたい関連記事</span></h2>
<ul>
<li><p><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方・基本操作をわかりやすく解説</a><br/>
DataFrameの行・列の基本構造を確認したい方におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/google-colab-csv/">Google Colab CSV 読み込み＆保存入門｜pandas で read_csv と to_csv を徹底解説</a><br/>
CSVを読み込んでから前処理する流れを確認したい方におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-pivot/">Pandas pivotとpivot_tableの違い｜重複データ対応と集計方法</a><br/>
<code>melt()</code> と逆方向の変形である <code>pivot()</code> / <code>pivot_table()</code> を学びたい方におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas groupby×aggの使い方｜基本の集計とaggの書き方を例で解説</a><br/>
<code>melt()</code> 後に集計へ進みたい方におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</a><br/>
縦持ちにしたカテゴリ列の件数を数えたい方におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/matplotlib-bar-barh-stacked/">Matplotlib 棒グラフ入門：横棒・グループ化・積み上げまで解説</a><br/>
集計したデータを棒グラフで可視化したい方におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-concat/">Pandas concat完全ガイド｜複数CSVからDataFrameを縦横結合する方法</a><br/>
複数のDataFrameを結合する処理と <code>melt()</code> の違いを整理したい方におすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-merge/">pandas mergeの使い方｜DataFrame結合（inner, left, outer）の違いと実例</a><br/>
キー列を使って別表を結合する方法を学びたい方におすすめです。</p>
</li>
</ul>


<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc30"> カテゴリから探す</span></h3> <ul> 
<ul>
  <li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->

<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>
<script>Prism.highlightAll();</script>
</div>



<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1777903786950" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">pandas melt()は何をするメソッドですか？</span></h3>
<div class="rank-math-answer ">

<p><code>melt()</code> は、横に広がった列を縦長にまとめるメソッドです。<br />たとえば、<code>1月</code>、<code>2月</code>、<code>3月</code> のような列を、<code>月</code> 列と <code>売上</code> 列に変換できます。</p>

</div>
</div>
<div id="faq-question-1777903811117" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">melt()はどんなときに使いますか？</span></h3>
<div class="rank-math-answer ">

<p>月別売上、科目別点数、商品別数量のように、同じ種類の情報が複数の列に分かれているときに使います。<br />集計、条件抽出、グラフ化をしやすい形に整えたい場合に向いています。</p>

</div>
</div>
<div id="faq-question-1777903821795" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc33">id_varsとvalue_varsの違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>id_vars</code> は、そのまま残す列です。<br /><code>value_vars</code> は、縦にまとめる列です。<br />月別売上データなら、社員名や部署は <code>id_vars</code>、<code>1月</code>、<code>2月</code>、<code>3月</code> は <code>value_vars</code> に指定します。</p>

</div>
</div>
<div id="faq-question-1777903832571" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc34">value_varsを省略してもよいですか？</span></h3>
<div class="rank-math-answer ">

<p>省略はできます。<br />ただし、<code>id_vars</code> 以外の列がすべて縦にまとめられるため、<code>備考</code> や <code>メモ</code> など不要な列まで入ることがあります。<br />初心者のうちは、<code>value_vars</code> を明示するほうが安全です。</p>

</div>
</div>
<div id="faq-question-1777903843836" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc35">variable列とvalue列は何を意味しますか？</span></h3>
<div class="rank-math-answer ">

<p><code>variable</code> 列には、元の列名が入ります。<br /><code>value</code> 列には、元のセルの値が入ります。<br /><code>var_name</code> と <code>value_name</code> を指定すると、<code>月</code>、<code>売上</code> のようにわかりやすい列名にできます。</p>

</div>
</div>
<div id="faq-question-1777903857932" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc36">melt()後に行数が増えるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>横に並んでいた値を縦に並べ直すためです。<br />たとえば、3人分のデータに3か月分の列がある場合、<code>melt()</code> 後は3人×3か月で9行になります。</p>

</div>
</div>
<div id="faq-question-1777903869428" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc37">melt()とpivot()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>melt()</code> は、横持ちデータを縦持ちデータに変換します。<br /><code>pivot()</code> は、縦持ちデータを横持ちデータに変換します。<br />ざっくり言うと、逆方向の処理です。</p>

</div>
</div>
<div id="faq-question-1777903883516" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc38">melt()したあとにgroupby()やグラフ化はできますか？</span></h3>
<div class="rank-math-answer ">

<p>できます。<br /><code>melt()</code> で縦持ちにしたあと、<code>groupby()</code> で集計し、Matplotlibでグラフ化する流れはよく使います。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-melt/">pandas melt()の使い方｜横持ちデータを縦持ちに変換する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-melt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pandas pivot と pivot_table を徹底解説！データ分析での使い分けと応用</title>
		<link>https://pythondatalab.com/pandas-pivot/</link>
					<comments>https://pythondatalab.com/pandas-pivot/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 09 Aug 2025 06:37:15 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=1074</guid>

					<description><![CDATA[<p>Pandas pivotとpivot_tableの違いを詳しく解説。重複データによるValueError回避方法、aggfuncの活用、クロス集計表作成などデータ分析の実践的テクニックを紹介します。 Converted  [&#8230;]</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-pivot/">Pandas pivot と pivot_table を徹底解説！データ分析での使い分けと応用</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
Pandas pivotとpivot_tableの違いを詳しく解説。重複データによるValueError回避方法、aggfuncの活用、クロス集計表作成などデータ分析の実践的テクニックを紹介します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.css" />
<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>

<!-- 余白を完全になくすCSS追加 -->
<style>
  pre[class*="language-"] {
    margin: 0 !important;
    padding: 1em;
  }
</style>

<script>Prism.highlightAll();</script>
<title>Converted Colab Notebook</title>
</head>
<body>

<!-- ▼▼▼ Pandasシリーズナビ（開始） ▼▼▼ -->
<p><style>
  /* ここだけに効く最小リセット */
  .pdl-series-nav p { margin: 0; line-height: 1.7; white-space: normal; }
  .pdl-series-nav a {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    white-space: normal !important;
  }
  /* 念のため画像リンク等のブロック化も無効化 */
  .pdl-series-nav a img { display: inline !important; }
</style></p>
<div id="pandas-series-nav" class="pdl-series-nav" style="clear: both; overflow: auto; position: relative; width: 100%; max-width: 100%; box-sizing: border-box; border: 2px solid #4db6ac; background: #eafaf8; padding: 14px 18px; border-radius: 10px; margin: 1.5em 0; box-shadow: 0 3px 6px rgba(0,0,0,0.05); transition: box-shadow .3s ease;">
<p style="margin: 0 0 6px 0; font-weight: 600; color: #00695c; font-size: 1.05em;">💡 Pandas DataFrame入門シリーズ</p>
<p>このページは「<a style="color: #00796b; text-decoration: underline; font-weight: 500;" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>」シリーズの一部です。データの作成から結合・集計までを体系的に学べます。</p>
</div>
<!-- ▲▲▲ Pandasシリーズナビ（終了） ▲▲▲ -->
<p>本記事で pandas pivot の基本と注意点を最初に整理します。データ分析をするとき、データを表に整理することが大切です。特に、元のデータを見たい形に並べ替える「ピボット」という操作はよく使われます。これは、バラバラに記録されたデータ（<strong>ロング形式</strong>）を、分析しやすい形（<strong>ワイド形式</strong>）に変換する<strong>データ集計</strong>や<strong>データ分析</strong>の重要なステップです。</p>
<p>たとえば、日付ごとにバラバラに記録された売上データを、「月」を横軸（列）に、「商品」を縦軸（行）にして、それぞれの「売上合計」がすぐわかるような表にする、といった場合に使います。このように、元のバラバラした形（<strong>ロング形式</strong>と呼びます）から、分析しやすい形（<strong>ワイド形式</strong>と呼びます）に変換するのがピボットです。</p>
<p>Pandas という便利なツールには、このピボットを行うための <code>pivot()</code> と <code>pivot_table()</code> という機能があります。どちらも似ていますが、使うデータに同じ組み合わせ（例：同じ月、同じ商品）が複数あるかどうかや、合計などの計算をするかどうかで使い分ける必要があります。特に、重複するデータを<strong>集計</strong>しながら<strong>クロス集計表</strong>を作成する際には <code>pivot_table()</code> が強力です。</p>
<p>この記事では、Pandas の <code>pivot</code> と <code>pivot_table</code> の基本的な使い方から、同じ組み合わせのデータをまとめる方法、複数の項目で整理する方法、そしてどちらの機能を選べば良いかまで、実際のコードを見ながら詳しく説明します。<strong>「pandas pivot」</strong> や <strong>「pandas pivot_table」</strong> の使い方を知りたい方、データを分かりやすく整理したい方、<strong>データ分析</strong>や<strong>データ集計</strong>を効率化したい方はぜひ読んでみてください。</p>
<p>▶️ Pandas pivotやpivot_tableの公式ドキュメントも参考にしてください：
<style>
ul.custom-links {
  margin: 0;
  padding-left: 1.2em;
}
ul.custom-links li {
  margin-bottom: 2px; /* 行間を詰める */
  list-style-type: disc;
}
</style>

<ul class="custom-links">
  <li><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pivot.html" target="_blank">pandas DataFrame.pivot</a></li>
  <li><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.pivot_table.html" target="_blank">pandas.pivot_table</a></li>
</ul>


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-11" checked><label class="toc-title" for="toc-checkbox-11">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Pandas pivot() の基本と使い方：重複しないデータの変換</a></li><li><a href="#toc2" tabindex="0">Pandas pivot_table()：重複データの集計と柔軟なピボット</a><ol><li><a href="#toc3" tabindex="0">Pandas pivot() の重要な制約：重複データによるエラー</a></li><li><a href="#toc4" tabindex="0">Pandas pivot と pivot_table の使い分け まとめ</a></li></ol></li><li><a href="#toc5" tabindex="0">Pandas pivot_table() の応用テクニック：複数条件での集計と詳細設定</a><ol><li><a href="#toc6" tabindex="0">複数レベルのインデックス (MultiIndex) の作成</a></li><li><a href="#toc7" tabindex="0">複数レベルのカラム (MultiColumn) の作成</a></li><li><a href="#toc8" tabindex="0">実社会での具体的な応用例</a></li></ol></li><li><a href="#toc9" tabindex="0">&lt;code&gt;Pandas pivot_table()&lt;/code&gt; の便利な引数とトラブルシューティング</a><ol><li><a href="#toc10" tabindex="0">NaN 値の扱い方 (fill_value 引数)</a></li><li><a href="#toc11" tabindex="0">様々な aggfunc の指定方法</a></li><li><a href="#toc12" tabindex="0">大規模データにおけるパフォーマンス考慮点</a></li></ol></li><li><a href="#toc13" tabindex="0">まとめ：Pandas pivot_table をマスターしてデータ分析を加速しよう</a><ol><li><a href="#toc14" tabindex="0">関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">Pandas pivot() の基本と使い方：重複しないデータの変換</span></h2>
<p>Pandas の <code>pivot()</code> 関数は、データフレームをシンプルに再形成するために使用されます。この関数は、<code>index</code>, <code>columns</code>, <code>values</code> の 3 つの引数を取り、指定した列をインデックス、カラム、値として新しいデータフレームを作成します。<strong>データ分析</strong>の初期段階で、重複のないシンプルなデータを整形するのに役立ちます。</p>

<p><strong>重要な点として、<code>pivot()</code> は <code>index</code> と <code>columns</code> で指定したキーの組み合わせが一意である（重複がない）データに対してのみ使用できます。</strong></p>

<p>まずは、<code>pivot()</code> を使うための重複のないサンプル売上データを作成しましょう。このデータは、各月・各商品の売上が1行に記録されており、重複する組み合わせはありません。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
import pandas as pd
# 重複のないデータを作成
unique_sales_data = {&#x27;月&#x27;: [&#x27;2023-01&#x27;, &#x27;2023-01&#x27;, &#x27;2023-02&#x27;, &#x27;2023-02&#x27;, &#x27;2023-03&#x27;, &#x27;2023-03&#x27;],
                     &#x27;商品&#x27;: [&#x27;りんご&#x27;, &#x27;バナナ&#x27;, &#x27;りんご&#x27;, &#x27;バナナ&#x27;, &#x27;りんご&#x27;, &#x27;バナナ&#x27;],
                     &#x27;売上（円）&#x27;: [1000, 800, 1100, 850, 1300, 950]}
unique_sales_df = pd.DataFrame(unique_sales_data)
display(unique_sales_df)
  </code>
</pre>


<div class="colab-df-container" id="df-fa52b84d-591f-4168-9ec0-c6ca7612316a">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">売上（円）</th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">950</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-fa52b84d-591f-4168-9ec0-c6ca7612316a')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-fa52b84d-591f-4168-9ec0-c6ca7612316a button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-fa52b84d-591f-4168-9ec0-c6ca7612316a');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-2635e446-5c0f-4260-a7d9-2d99629b946c">
<button class="colab-df-quickchart" onclick="quickchart('df-2635e446-5c0f-4260-a7d9-2d99629b946c')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-2635e446-5c0f-4260-a7d9-2d99629b946c button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_11d79373-0129-4b48-8e90-fb9aae9c55b3">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('unique_sales_df')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_11d79373-0129-4b48-8e90-fb9aae9c55b3 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('unique_sales_df');
      }
      })();
    </script>
</div>
</div>
</div>

<p>この重複のない <code>unique_sales_df</code> を使って、<code>pivot()</code> の基本的な使い方を見てみましょう。ここでは、「月」を新しいデータフレームのインデックス、「商品」をカラム、「売上（円）」を値としてピボットします。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
unique_sales_pivot = unique_sales_df.pivot(index=&#x27;月&#x27;, columns=&#x27;商品&#x27;, values=&#x27;売上（円）&#x27;)
display(unique_sales_pivot)
  </code>
</pre>


<div class="colab-df-container" id="df-eb1729e0-c8ac-4ef5-a9c1-1ba90de28f02">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-02</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-03</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">950</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-eb1729e0-c8ac-4ef5-a9c1-1ba90de28f02')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-eb1729e0-c8ac-4ef5-a9c1-1ba90de28f02 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-eb1729e0-c8ac-4ef5-a9c1-1ba90de28f02');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-31093769-fe42-4e8b-ac1a-31ecfc1fd711">
<button class="colab-df-quickchart" onclick="quickchart('df-31093769-fe42-4e8b-ac1a-31ecfc1fd711')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-31093769-fe42-4e8b-ac1a-31ecfc1fd711 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_ecf087a3-3be0-46be-852e-cc4436b798d3">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('unique_sales_pivot')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_ecf087a3-3be0-46be-852e-cc4436b798d3 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('unique_sales_pivot');
      }
      })();
    </script>
</div>
</div>
</div>

<h2><span id="toc2">Pandas pivot_table()：重複データの集計と柔軟なピボット</span></h2>
<p><code>pandas.pivot_table()</code> は、<code>pivot()</code> よりも高機能で、特に<strong>インデックスとカラムの組み合わせに重複があるデータ</strong>の<strong>集計</strong>に特化しています。<strong>データ集計</strong>（Aggregation）を行いながらデータをピボットできる点が <code>pivot()</code> との最大の違いです。これにより、複雑な<strong>クロス集計表</strong>を簡単に作成できます。</p>
<p>pivot_table() は pivot() の引数 (<code>index</code>, <code>columns</code>, <code>values</code>) に加えて、<code>aggfunc</code> という重要な引数を持っています。<code>aggfunc</code> には、重複する値に対して適用したい集計関数（例: &#8216;sum&#8217;, &#8216;mean&#8217;, &#8216;count&#8217;, <code>np.sum</code> など）を指定します。</p>
<p>先ほどの <code>unique_sales_df</code> は重複がありませんでしたが、実際のビジネスデータでは同じ月、同じ商品でも複数の店舗や取引でデータが重複することがよくあります。このような場合に <code>pivot_table()</code> が役立ちます。<strong>データ分析</strong>において、このような重複データの<strong>集計</strong>は不可欠です。</p>
<p>重複を含むサンプルデータ <code>sales_df</code> を使用して、<code>pivot_table()</code> の使い方を見ていきましょう。このデータでは、同じ「月」と「商品」の組み合わせで複数の「店舗」のデータが含まれており、<strong>データ集計</strong>が必要なケースです。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_data = {&#x27;月&#x27;: [&#x27;2023-01&#x27;, &#x27;2023-01&#x27;, &#x27;2023-01&#x27;, &#x27;2023-02&#x27;, &#x27;2023-02&#x27;, &#x27;2023-02&#x27;, &#x27;2023-03&#x27;, &#x27;2023-03&#x27;, &#x27;2023-03&#x27;],
              &#x27;店舗&#x27;: [&#x27;A&#x27;, &#x27;A&#x27;, &#x27;B&#x27;, &#x27;B&#x27;, &#x27;A&#x27;, &#x27;A&#x27;, &#x27;B&#x27;, &#x27;B&#x27;, &#x27;A&#x27;],
              &#x27;商品&#x27;: [&#x27;りんご&#x27;, &#x27;バナナ&#x27;, &#x27;りんご&#x27;, &#x27;バナナ&#x27;, &#x27;りんご&#x27;, &#x27;バナナ&#x27;, &#x27;りんご&#x27;, &#x27;バナナ&#x27;, &#x27;バナナ&#x27;],
              &#x27;売上（円）&#x27;: [1000, 800, 1200, 900, 1100, 850, 1300, 950, 850],
              &#x27;売上原価（円）&#x27;: [700, 500, 700, 600, 700, 400, 700, 550, 500]}
sales_df = pd.DataFrame(sales_data)
display(sales_df)
  </code>
</pre>


<div class="colab-df-container" id="df-ae363eb3-2be6-4811-801f-52e5343d9b2b">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">売上（円）</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">売上原価（円）</th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">600</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">400</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">950</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">550</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">8</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2023-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-ae363eb3-2be6-4811-801f-52e5343d9b2b')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-ae363eb3-2be6-4811-801f-52e5343d9b2b button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-ae363eb3-2be6-4811-801f-52e5343d9b2b');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-3a9b375b-c9d9-4dcb-bd78-d9eed5120948">
<button class="colab-df-quickchart" onclick="quickchart('df-3a9b375b-c9d9-4dcb-bd78-d9eed5120948')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-3a9b375b-c9d9-4dcb-bd78-d9eed5120948 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_df9e3767-5d60-4bc7-9b9d-4a6c71f2d0d9">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_df')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_df9e3767-5d60-4bc7-9b9d-4a6c71f2d0d9 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_df');
      }
      })();
    </script>
</div>
</div>
</div>


<h3><span id="toc3">Pandas pivot() の重要な制約：重複データによるエラー</span></h3>
<p><code>pandas.pivot()</code> は、<code>index</code> と <code>columns</code> で指定したキーの組み合わせが一意である場合にのみ機能します。もし、指定した <code>index</code> と <code>columns</code> の組み合わせに複数の行が該当する場合、<code>pivot()</code> はどの値を新しいデータフレームに配置すれば良いか判断できず、<code>ValueError: Index contains duplicate entries, cannot reshape</code> のようなエラーが発生します。</p>
<p>例えば、以下のデータのように、2023-01月のりんごの売上データが複数存在する場合、<code>unique_sales_df.pivot(index='月', columns='商品', values='売上（円）')</code> を実行するとエラーになります。</p>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上（円）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500</td>
    </tr>
  </tbody>
</table>
<p>↑この重複がエラーの原因</p>
<p>このように、集計せずに単純なデータ再形成を行いたい場合に <code>pivot()</code> は便利ですが、データの重複が少しでもある場合は、後述する <code>pivot_table()</code> を使う必要があります。</p>
<p><code>sales_df</code> を使って、「月」をインデックス、「商品」をカラム、「売上（円）」を値として <code>pivot_table()</code> を実行し、重複する「月」と「商品」の組み合わせの「売上（円）」を合計してみましょう。<code>aggfunc='sum'</code> を指定します。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_pivot_table_sum = sales_df.pivot_table(index=&#x27;月&#x27;, columns=&#x27;商品&#x27;, values=&#x27;売上（円）&#x27;, aggfunc=&#x27;sum&#x27;)
display(sales_pivot_table_sum)
  </code>
</pre>


<div class="colab-df-container" id="df-07df3e11-768e-445d-bba7-b9aab057767b">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-02</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1750</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-03</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1800</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-07df3e11-768e-445d-bba7-b9aab057767b')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-07df3e11-768e-445d-bba7-b9aab057767b button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-07df3e11-768e-445d-bba7-b9aab057767b');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-bdfc3d6c-6844-4d9a-82d2-c6cc0233ca96">
<button class="colab-df-quickchart" onclick="quickchart('df-bdfc3d6c-6844-4d9a-82d2-c6cc0233ca96')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-bdfc3d6c-6844-4d9a-82d2-c6cc0233ca96 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_06e8ac27-67b7-43f6-97b5-37aa6436125c">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_pivot_table_sum')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_06e8ac27-67b7-43f6-97b5-37aa6436125c button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_pivot_table_sum');
      }
      })();
    </script>
</div>
</div>
</div>

<p>ご覧のように、<code>pivot_table()</code> は重複する「月」と「商品」の組み合わせ（例: 2023-03 月のバナナ）に対して、指定した<strong>集計関数</strong> (<code>sum</code>) を適用して結果を返します。2023-03 月のバナナの売上は、店舗 B (950 円) と店舗 A (850 円) の合計値 (950 + 850 = 1800 円) となっています。このように、<code>pivot_table()</code> を使うことで、重複するデータを適切に<strong>集計</strong>し、<strong>クロス集計表</strong>を作成できます。</p>
<p>同様に、平均を計算したい場合は <code>aggfunc='mean'</code> を指定します。ここでは「売上原価（円）」の平均を見てみましょう。これも<strong>データ集計</strong>の一種です。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_pivot_table_mean = sales_df.pivot_table(index=&#x27;月&#x27;, columns=&#x27;商品&#x27;, values=&#x27;売上原価（円）&#x27;, aggfunc=&#x27;mean&#x27;)
display(sales_pivot_table_mean)
  </code>
</pre>


<div class="colab-df-container" id="df-cfe67ed8-aec6-4eb3-8594-45374a923251">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-02</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-03</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">525.0</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-cfe67ed8-aec6-4eb3-8594-45374a923251')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-cfe67ed8-aec6-4eb3-8594-45374a923251 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-cfe67ed8-aec6-4eb3-8594-45374a923251');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-1cfb4b52-f391-4087-a80f-a95959dbf5d4">
<button class="colab-df-quickchart" onclick="quickchart('df-1cfb4b52-f391-4087-a80f-a95959dbf5d4')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-1cfb4b52-f391-4087-a80f-a95959dbf5d4 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_610bc51e-930d-4ae2-a02d-57704dc7eadb">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_pivot_table_mean')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_610bc51e-930d-4ae2-a02d-57704dc7eadb button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_pivot_table_mean');
      }
      })();
    </script>
</div>
</div>
</div>

<h3><span id="toc4">Pandas pivot と pivot_table の使い分け まとめ</span></h3>
<p>Pandas でデータフレームのピボットを行う際に、<code>pivot()</code> と <code>pivot_table()</code> のどちらを使うべきか迷うことがあります。以下にそれぞれの特徴と使い分けのポイントをまとめます。<strong>データ分析</strong>の目的に応じて適切な関数を選ぶことが重要です。</p>
<ul>
  <li><strong><code>pandas.pivot()</code></strong>: <code>index</code> と <code>columns</code> で指定するキーの組み合わせが<strong>一意である</strong>データにのみ使用できます。単純なデータの形を変える（再形成する）ことに特化しており、<strong>集計は行いません</strong>。重複がないことが確実な、シンプルなデータ変換に適しています。<strong>データ分析</strong>の初期段階での整形に利用されることがあります。</li>
  <li><strong><code>pandas.pivot_table()</code></strong>: <code>index</code> と <code>columns</code> で指定するキーの組み合わせに<strong>重複があっても使用できます</strong>。重複する値に対して <code>aggfunc</code> で指定した<strong>集計処理を行います</strong>。<strong>データ集計</strong>と同時にデータの形を変換したい場合や、データの重複が予想される場合に適しています。これにより、詳細な<strong>クロス集計表</strong>を作成できます。</li>
</ul>
<p><strong>結論として、データの重複の可能性がある場合は、迷わず <code>pivot_table()</code> を使用するのが安全で一般的です。</strong> <strong>データ分析</strong>において、生のデータには重複が含まれることが多いため、<code>pivot_table()</code> がより頻繁に利用されます。重複がないことが保証されている、非常にシンプルなケースでのみ <code>pivot()</code> を検討すると良いでしょう。</p>
<h2><span id="toc5">Pandas pivot_table() の応用テクニック：複数条件での集計と詳細設定</span></h2>
<p><code>pivot_table()</code> は、単一の列だけでなく、複数の列を組み合わせてインデックスやカラムとして使用することで、より複雑で多角的な<strong>データ集計</strong>・<strong>データ分析</strong>を行うことができます。これにより、データの階層的な構造を表現した<strong>クロス集計表</strong>を作成することが可能です。<strong>データ分析</strong>において、多次元的な視点からデータを把握するのに非常に役立ちます。</p>
<h3><span id="toc6">複数レベルのインデックス (MultiIndex) の作成</span></h3>
<p><code>index</code> 引数に列名のリストを指定することで、複数のレベルを持つ階層的なインデックス（MultiIndex）を作成できます。例えば、「月」と「店舗」をインデックス、「商品」をカラム、「売上原価（円）」を値として、それぞれの合計を<strong>集計</strong>してみましょう。これは<strong>データ集計</strong>の一例であり、店舗ごとの月別売上原価の傾向を把握するのに役立ちます。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_pivot_multi_index = sales_df.pivot_table(index=[&#x27;月&#x27;, &#x27;店舗&#x27;], columns=&#x27;商品&#x27;, values=&#x27;売上原価（円）&#x27;, aggfunc=&#x27;sum&#x27;)
display(sales_pivot_multi_index)
  </code>
</pre>


<div class="colab-df-container" id="df-03ad12e1-67a7-4e8b-8a5d-177b7721489c">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th rowspan="2" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;" valign="top">2023-01</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">A</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">B</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
</tr>
<tr>
<th rowspan="2" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;" valign="top">2023-02</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">A</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">400.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">B</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">600.0</td>
</tr>
<tr>
<th rowspan="2" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;" valign="top">2023-03</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">A</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">B</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">550.0</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-03ad12e1-67a7-4e8b-8a5d-177b7721489c')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-03ad12e1-67a7-4e8b-8a5d-177b7721489c button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-03ad12e1-67a7-4e8b-8a5d-177b7721489c');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-cdf8da28-0588-419d-b750-d0689f85f4c5">
<button class="colab-df-quickchart" onclick="quickchart('df-cdf8da28-0588-419d-b750-d0689f85f4c5')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-cdf8da28-0588-419d-b750-d0689f85f4c5 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_7b07c985-ca19-408d-a309-518ddb339923">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_pivot_multi_index')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_7b07c985-ca19-408d-a309-518ddb339923 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_pivot_multi_index');
      }
      })();
    </script>
</div>
</div>
</div>

<p>このように、外側のレベルに「月」、その内側のレベルに「店舗」という階層構造を持つインデックスが作成されました。</p>
<h3><span id="toc7">複数レベルのカラム (MultiColumn) の作成</span></h3>
<p>同様に、<code>columns</code> 引数に列名のリストを指定することで、複数のレベルを持つ階層的なカラム（MultiColumn）を作成できます。ここでは、「月」をインデックス、「店舗」と「商品」をカラム、「売上（円）」を値として、それぞれの合計を集計してみましょう。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_pivot_multi_columns = sales_df.pivot_table(index=&#x27;月&#x27;, columns=[&#x27;店舗&#x27;, &#x27;商品&#x27;], values=&#x27;売上（円）&#x27;, aggfunc=&#x27;sum&#x27;)
display(sales_pivot_multi_columns)
  </code>
</pre>


<div class="colab-df-container" id="df-cee6c02e-cb2d-4c35-89ed-3e0d4852bdaa">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead tr th {
        text-align: left;
    }

    .dataframe thead tr:last-of-type th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">A</th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">B</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1200.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-02</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">900.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-03</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">950.0</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-cee6c02e-cb2d-4c35-89ed-3e0d4852bdaa')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-cee6c02e-cb2d-4c35-89ed-3e0d4852bdaa button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-cee6c02e-cb2d-4c35-89ed-3e0d4852bdaa');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-e7c64537-b2ab-4736-b3de-defb7bd2615b">
<button class="colab-df-quickchart" onclick="quickchart('df-e7c64537-b2ab-4736-b3de-defb7bd2615b')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-e7c64537-b2ab-4736-b3de-defb7bd2615b button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_a9470b16-9132-48c8-9fdc-3976c67d2c9b">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_pivot_multi_columns')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_a9470b16-9132-48c8-9fdc-3976c67d2c9b button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_pivot_multi_columns');
      }
      })();
    </script>
</div>
</div>
</div>

<p>外側のレベルに「店舗」、その内側のレベルに「商品」という階層構造を持つカラムが作成されました。<code>pivot_table()</code> を活用することで、このように様々な切り口でデータを集計し、ビジネスの意思決定に役立つインサイトを得ることが可能になります。</p>
<p>&gt;『インサイト』とは、データ分析から得られる、物事の本質を見抜く洞察や、次に取るべき行動のヒントになるような深い理解のことです。</p>
<h3><span id="toc8">実社会での具体的な応用例</span></h3>
<p><code>pivot_table()</code> は様々な種類の<strong>データ分析</strong>に活用できます。いくつか具体的なシナリオを見てみましょう。これにより、いかに<code>pivot_table()</code>が<strong>データ集計</strong>と<strong>クロス集計表</strong>作成に役立つかが分かります。</p>
<p><strong>例 1：EC サイトの売上データ</strong></p>
<p>EC サイトの売上データがあるとします。ここには、注文 ID、顧客 ID、購入日、商品カテゴリ、商品名、価格などの情報が含まれています。<code>pivot_table()</code> を使うと、以下のような<strong>データ分析</strong>が可能です。</p>
<ul>
  <li><strong>月別の商品カテゴリ別売上集計:</strong></li>
</ul>
<p><code>sales_df.pivot_table(index='購入月', columns='商品カテゴリ', values='価格', aggfunc='sum')</code><br>
→ 各月のどの商品カテゴリがどれだけ売れているか一目で把握できます。これは典型的な<strong>クロス集計表</strong>を用いた<strong>データ集計</strong>です。</p>
<ul>
  <li><strong>顧客別の購入商品集計:</strong></li>
</ul>
<p><code>sales_df.pivot_table(index='顧客ID', columns='商品名', values='注文ID', aggfunc='count', fill_value=0)</code><br>
→ 各顧客がどの商品をいくつ購入したかを知ることができます。リピート購入されている商品を特定するのに役立ちます。顧客行動の<strong>データ分析</strong>に繋がります。</p>
<p><strong>例 2：顧客データ</strong></p>
<p>顧客データには、顧客 ID、年齢、性別、居住地域、最終購入日などの情報が含まれているとします。</p>
<ul>
  <li><strong>地域別の性別構成比:</strong></li>
</ul>
<p><code>customer_df.pivot_table(index='居住地域', columns='性別', values='顧客ID', aggfunc='count', fill_value=0)</code><br>
→ どの地域の顧客層がどの性別に偏っているかを確認できます。これも<strong>クロス集計表</strong>による<strong>データ分析</strong>の一例です。</p>
<p><strong>例 3：アンケートデータ</strong></p>
<p>製品やサービスに関するアンケートデータがあるとします。回答者の属性（年齢層、職業など）と、各質問への回答（5 段階評価など）が含まれています。</p>
<ul>
  <li><strong>年齢層別の質問評価平均:</strong></li>
</ul>
<p><code>survey_df.pivot_table(index='年齢層', columns='質問項目', values='評価点', aggfunc='mean')</code><br>
→ どの年齢層が特定の質問項目に対してどのような評価をしているかの平均を知ることができます。製品改善の優先順位付けに役立ちます。アンケート結果の<strong>データ集計</strong>と<strong>データ分析</strong>に有効です。</p>
<p>これらの例のように、<code>pivot_table()</code> はビジネスデータの様々な切り口での<strong>データ集計</strong>・<strong>データ分析</strong>に非常に強力なツールとなります。あなたの持っているデータをどのように<strong>集計</strong>・<strong>分析</strong>したいかを考え、適切な <code>index</code>, <code>columns</code>, <code>values</code>, <code>aggfunc</code> を指定することで、データから有用なインサイトを引き出すことができます。<strong>クロス集計表</strong>の作成は、<strong>データ分析</strong>の基本であり、<code>pivot_table()</code>はその中心的な役割を担います。</p>

<h2><span id="toc9">&lt;code&gt;Pandas pivot_table()&lt;/code&gt; の便利な引数とトラブルシューティング</span></h2>
<p><code>pivot_table()</code> をより効果的に使用するための便利な引数や、よく遭遇する問題とその解決策について解説します。これにより、<strong>データ集計</strong>や<strong>データ分析</strong>の効率をさらに向上させることができます。</p>
<h3><span id="toc10">NaN 値の扱い方 (fill_value 引数)</span></h3>
<p>ピボットした結果のデータフレームで、元のデータに存在しないインデックスとカラムの組み合わせには、デフォルトで <code>NaN</code> (Not a Number) が表示されます。これは、その組み合わせに対応するデータがなかったことを意味します。</p>
<p>分析や後続処理の都合上、これらの <code>NaN</code> を特定の値（例えば 0）で埋めたい場合は、<code>fill_value</code> 引数を使用します。</p>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_pivot_multi_columns = sales_df.pivot_table(index=&#x27;月&#x27;, columns=[&#x27;店舗&#x27;, &#x27;商品&#x27;], values=&#x27;売上（円）&#x27;, aggfunc=&#x27;sum&#x27;,fill_value=0)
display(sales_pivot_multi_columns)
  </code>
</pre>


<div class="colab-df-container" id="df-005d1e8e-0eb8-493f-ac6b-f80ec1e64c93">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead tr th {
        text-align: left;
    }

    .dataframe thead tr:last-of-type th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">A</th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">B</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-02</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-03</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">850</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">950</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-005d1e8e-0eb8-493f-ac6b-f80ec1e64c93')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-005d1e8e-0eb8-493f-ac6b-f80ec1e64c93 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-005d1e8e-0eb8-493f-ac6b-f80ec1e64c93');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-5c52dd3c-797b-4333-8b4f-f581411f7f01">
<button class="colab-df-quickchart" onclick="quickchart('df-5c52dd3c-797b-4333-8b4f-f581411f7f01')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-5c52dd3c-797b-4333-8b4f-f581411f7f01 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_3897968f-7869-4dc5-be49-49693ebc1663">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_pivot_multi_columns')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_3897968f-7869-4dc5-be49-49693ebc1663 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_pivot_multi_columns');
      }
      })();
    </script>
</div>
</div>
</div>

<p>fill_value=0 を指定することで、データが存在しなかった箇所が 0 で埋められていることが確認できます。これは、クロス集計表を見やすくしたり、後続の計算処理でエラーが出ないようにするための便利な機能です。データ分析においては、欠損値の適切な処理が重要になります。</p>
<h3><span id="toc11">様々な aggfunc の指定方法</span></h3>
<p><code>aggfunc</code> には、<strong>集計関数</strong>名を文字列で指定する以外にも、より柔軟な指定方法があります。これにより、<strong>データ集計</strong>のニーズに合わせて多様な計算を適用できます。</p>
<ul><li>  <strong>集計関数のリスト</strong>: 複数の<strong>集計</strong>（例: 合計と平均）を一度に行いたい場合に便利です。</li></ul>
<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_pivot_multi_agg = sales_df.pivot_table(index=&#x27;月&#x27;, columns=&#x27;商品&#x27;, values=&#x27;売上（円）&#x27;, aggfunc=[&#x27;sum&#x27;, &#x27;mean&#x27;])
display(sales_pivot_multi_agg)
  </code>
</pre>


<div class="colab-df-container" id="df-6c8799ac-7b5c-4b71-ad15-289fca012787">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead tr th {
        text-align: left;
    }

    .dataframe thead tr:last-of-type th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">sum</th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">mean</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-02</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1750</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">875.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-03</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1800</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">900.0</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-6c8799ac-7b5c-4b71-ad15-289fca012787')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-6c8799ac-7b5c-4b71-ad15-289fca012787 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-6c8799ac-7b5c-4b71-ad15-289fca012787');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-7712db05-8ca9-4872-b1da-6ffb850aa15a">
<button class="colab-df-quickchart" onclick="quickchart('df-7712db05-8ca9-4872-b1da-6ffb850aa15a')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-7712db05-8ca9-4872-b1da-6ffb850aa15a button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_dd19f51d-d97c-4270-8b5d-316e65e446f0">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_pivot_multi_agg')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_dd19f51d-d97c-4270-8b5d-316e65e446f0 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_pivot_multi_agg');
      }
      })();
    </script>
</div>
</div>
</div>

<ul><li>  <strong>列ごとの集計関数を定義する辞書</strong>: 異なる列に対して異なる<strong>集計関数</strong>を適用したい場合に便利です。<code>values</code> 引数も辞書形式で指定する必要があります。これは、例えば売上は合計、利益率は平均、といった異なる種類の<strong>データ集計</strong>を同時に行いたい場合に有効です。</li></ul>

<pre class="language-python" data-prismjs-copy>
  <code class="language-python">
sales_pivot_dict_agg = sales_df.pivot_table(index=&#x27;月&#x27;, columns=&#x27;商品&#x27;, values={&#x27;売上（円）&#x27;: &#x27;sum&#x27;, &#x27;売上原価（円）&#x27;: &#x27;mean&#x27;})
display(sales_pivot_dict_agg)
  </code>
</pre>


<div class="colab-df-container" id="df-10af0bc1-9955-425e-a529-471ce7d5386b">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead tr th {
        text-align: left;
    }

    .dataframe thead tr:last-of-type th {
        text-align: right;
    }
</style>
<table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">売上原価（円）</th>
<th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">売上（円）</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">りんご</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">バナナ</th>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">月</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
</tr>
</thead>
<tbody>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-01</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">800.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-02</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1100.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">875.0</td>
</tr>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2023-03</th>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">525.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">1300.0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">900.0</td>
</tr>
</tbody>
</table>
</div>
<div class="colab-df-buttons">
<div class="colab-df-container">
<button class="colab-df-convert" onclick="convertToInteractive('df-10af0bc1-9955-425e-a529-471ce7d5386b')" style="display:none;" title="Convert this dataframe to an interactive table.">
<svg height="24px" viewbox="0 -960 960 960" xmlns="http://www.w3.org/2000/svg">
<path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
</svg>
</button>
<style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>
<script>
      const buttonEl =
        document.querySelector('#df-10af0bc1-9955-425e-a529-471ce7d5386b button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-10af0bc1-9955-425e-a529-471ce7d5386b');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
</div>
<div id="df-299dc0b7-d5f2-4593-9571-25d2f5ff741a">
<button class="colab-df-quickchart" onclick="quickchart('df-299dc0b7-d5f2-4593-9571-25d2f5ff741a')" style="display:none;" title="Suggest charts">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"></path>
</g>
</svg>
</button>
<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>
<script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-299dc0b7-d5f2-4593-9571-25d2f5ff741a button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
</div>
<div id="id_128d1f63-caa4-4e2d-b993-6cb15bdf0f5e">
<style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
<button class="colab-df-generate" onclick="generateWithVariable('sales_pivot_dict_agg')" style="display:none;" title="Generate code using this dataframe.">
<svg height="24px" viewbox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
<path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
</svg>
</button>
<script>
      (() => {
      const buttonEl =
        document.querySelector('#id_128d1f63-caa4-4e2d-b993-6cb15bdf0f5e button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_pivot_dict_agg');
      }
      })();
    </script>
</div>
</div>
</div>

<h3><span id="toc12">大規模データにおけるパフォーマンス考慮点</span></h3>
<p>大規模なデータセットに対して <code>pivot_table()</code> を実行する場合、処理に時間がかかったり、メモリを大量に消費したりする可能性があります。<strong>データ分析</strong>において、パフォーマンスは重要な要素です。パフォーマンスを向上させるためには、以下の点を考慮してください。</p>
<ul><li>  <strong>不要な列を事前に削除</strong>: ピボットに関係のない列は、事前に DataFrame から削除することで、メモリ使用量と処理時間を削減できます。<strong>データ前処理</strong>の段階で<strong>データ分析</strong>に必要な列のみを選択することが重要です。</li><li>  <strong>データの型を最適化</strong>: 特に文字列データが多い列は、カテゴリ型 (<code>category</code>) に変換することでメモリ効率が向上する場合があります。適切なデータ型を使用することは、大規模データの<strong>データ集計</strong>において特に有効です。</li><li>  <strong>データ型の確認</strong>: 数値データがオブジェクト型 (<code>object</code>) になっていると計算が遅くなるため、適切な数値型 (<code>int</code>, <code>float</code>) に変換します。<strong>データ分析</strong>の精度と速度に影響します。</li><li>  <strong>チャンク処理</strong>: 非常に大きなデータセットの場合は、データを小さなチャンク（塊）に分割して <code>pivot_table()</code> を適用し、後で結果を結合することも有効な手段です。メモリが限られている環境での<strong>データ集計</strong>に役立ちます。</li></ul>

<h2><span id="toc13">まとめ：Pandas pivot_table をマスターしてデータ分析を加速しよう</span></h2>
<p>本記事では、Pandas ライブラリにおけるデータ再形成と<strong>データ集計</strong>のための主要な関数である <code>pivot()</code> と <code>pivot_table()</code> について詳しく解説しました。これらの関数は、<strong>データ分析</strong>において<strong>クロス集計表</strong>を作成する上で非常に重要です。</p>
<ul>
  <li><strong><code>pandas.pivot()</code></strong>: <code>index</code> と <code>columns</code> の組み合わせが一意であるデータに対して、シンプルなデータ再形成を行います。<strong>データ集計</strong>機能はありません。シンプルな<strong>データ分析</strong>の初期整形に利用します。</li>
  <li><strong><code>pandas.pivot_table()</code></strong>: <code>index</code> と <code>columns</code> の組み合わせに重複があるデータを含む、より柔軟な<strong>データ集計</strong>と再形成を行います。<code>aggfunc</code> 引数で様々な<strong>集計関数</strong>を指定できます。<strong>クロス集計表</strong>の作成や詳細な<strong>データ分析</strong>に不可欠です。</li>
</ul>
<p><code>pivot_table()</code> は、生のデータを<strong>データ分析</strong>に適した<strong>クロス集計表</strong>の形式に変換するための、<strong>データ分析</strong>において非常に重要なツールです。売上データの月別・商品別<strong>集計</strong>、アンケート結果の<strong>クロス集計</strong>、各種レポート作成など、幅広い場面でその強力な機能を発揮します。<strong>データ分析</strong>の効率と質を高めるために、<code>pivot_table()</code>は欠かせません。</p>
<p>この記事で解説した内容を参考に、ぜひあなたの<strong>データ分析</strong>ワークフローに <code>pivot_table()</code> を積極的に取り入れてみてください。実際に様々なデータに対して <code>pivot_table()</code> を試すことで、さらに理解を深めることができるでしょう。<strong>データ集計</strong>と<strong>クロス集計表</strong>の作成をマスターし、<strong>データ分析</strong>を加速させましょう。</p>

</body>
</html>





<!-- ▼▼▼ 関連記事ボックス 共通スタイル（集計・変形）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc14">関連記事</span></h3> <ul> 
<ul>
  <li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ データ抽出・前処理：loc, iloc, isin, dropの使い方</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ MatplotlibでPandasデータを可視化する方法</a></li> </ul> </div>
<!-- ▼▼▼ 関連記事ボックス 共通スタイル（集計・変形）終了▼▼▼ -->



<!-- ▼▼▼ Pandasシリーズナビ（開始） ▼▼▼ -->
<p><style>
  /* ここだけに効く最小リセット */
  .pdl-series-nav p { margin: 0; line-height: 1.7; white-space: normal; }
  .pdl-series-nav a {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    white-space: normal !important;
  }
  /* 念のため画像リンク等のブロック化も無効化 */
  .pdl-series-nav a img { display: inline !important; }
</style></p>
<div id="pandas-series-nav" class="pdl-series-nav" style="clear: both; overflow: auto; position: relative; width: 100%; max-width: 100%; box-sizing: border-box; border: 2px solid #4db6ac; background: #eafaf8; padding: 14px 18px; border-radius: 10px; margin: 1.5em 0; box-shadow: 0 3px 6px rgba(0,0,0,0.05); transition: box-shadow .3s ease;">
<p style="margin: 0 0 6px 0; font-weight: 600; color: #00695c; font-size: 1.05em;">💡 Pandas DataFrame入門シリーズ</p>
<p>このページは「<a style="color: #00796b; text-decoration: underline; font-weight: 500;" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>」シリーズの一部です。データの作成から結合・集計までを体系的に学べます。</p>
</div>
<!-- ▲▲▲ Pandasシリーズナビ（終了） ▲▲▲ -->



<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>



<p class="wp-block-paragraph"></p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-pivot/">Pandas pivot と pivot_table を徹底解説！データ分析での使い分けと応用</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-pivot/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas MultiIndex完全ガイド｜階層型インデックスの作成・選択・集計方法</title>
		<link>https://pythondatalab.com/pandas-multiindex/</link>
					<comments>https://pythondatalab.com/pandas-multiindex/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 02 Aug 2025 09:39:45 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=1035</guid>

					<description><![CDATA[<p>pandasのMultiIndex（階層型インデックス）を図解で理解。作成・選択・集計・stack/unstackなど実務で役立つ操作を丁寧に解説。 💡 Pandas DataFrame入門シリーズ このページは「Pan [&#8230;]</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-multiindex/">pandas MultiIndex完全ガイド｜階層型インデックスの作成・選択・集計方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
pandasのMultiIndex（階層型インデックス）を図解で理解。作成・選択・集計・stack/unstackなど実務で役立つ操作を丁寧に解説。
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.css" />
  <script src="https://cdn.jsdelivr.net/npm/prismjs/prism.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
  <style>
    pre[class*="language-"] {
      margin: 0 !important;
      padding: 1em;
    }
    table.wp-block-table td:first-child, table.wp-block-table th:first-child {
      min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;
    }
    table.wp-block-table td:not(:first-child), table.wp-block-table th:not(:first-child) {
      white-space: nowrap; padding: 0.2em 0.4em;
    }
  </style>
  <script>Prism.highlightAll();</script>
</head>
<body>

<!-- ▼▼▼ Pandasシリーズナビ（開始） ▼▼▼ -->
<p><style>
  /* ここだけに効く最小リセット */
  .pdl-series-nav p { margin: 0; line-height: 1.7; white-space: normal; }
  .pdl-series-nav a {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    white-space: normal !important;
  }
  /* 念のため画像リンク等のブロック化も無効化 */
  .pdl-series-nav a img { display: inline !important; }
</style></p>
<div id="pandas-series-nav" class="pdl-series-nav" style="clear: both; overflow: auto; position: relative; width: 100%; max-width: 100%; box-sizing: border-box; border: 2px solid #4db6ac; background: #eafaf8; padding: 14px 18px; border-radius: 10px; margin: 1.5em 0; box-shadow: 0 3px 6px rgba(0,0,0,0.05); transition: box-shadow .3s ease;">
<p style="margin: 0 0 6px 0; font-weight: 600; color: #00695c; font-size: 1.05em;">💡 Pandas DataFrame入門シリーズ</p>
<p>このページは「<a style="color: #00796b; text-decoration: underline; font-weight: 500;" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>」シリーズの一部です。データの作成から結合・集計までを体系的に学べます。</p>
</div>
<!-- ▲▲▲ Pandasシリーズナビ（終了） ▲▲▲ -->


<p>データ分析でこんなことを思ったことはありませんか？</p>
<ul>
<li>複数の条件（例えば「ある月の特定の店舗での売上」）でデータを絞り込みたいけど、どうすれば効率的なんだろう？</li>
<li>店舗別、商品別、さらには「月ごとの店舗別」のように、様々な粒度でデータを集計して比較したいけど、もっと簡単な方法はないかな？</li>
</ul>
<p>この記事では、pandas の<strong>階層型インデックス (pandas MultiIndex)</strong> を使うことで、驚くほどスマートに解決できます！</p>
<p>pandas の MultiIndex（階層型インデックス）は、DataFrame の行や列に複数のレベルのラベルを付けることができる機能です。これにより、スプレッドシートでいうところの「複数行の見出し」のような構造をデータに持たせることができ、複雑なデータも直感的に、そして効率的に扱えるようになります。</p>
<p>pandas MultiIndex を使うと、次のような分析や操作が驚くほど簡単になります！</p>
<ul>
<li><strong>特定の条件での絞り込み</strong>: 「2023 年 1 月の A 店のりんごの売上だけを見たい」「特定の期間の B 店の全商品データを取り出したい」といった、複数の条件を組み合わせたデータ抽出が直感的に行えます。</li>
<li><strong>柔軟な集計</strong>: 「店舗ごとの合計売上」「月ごとの商品別売上」「商品ごとの全店舗での平均売上」など、様々な粒度での集計が効率的に行え、ビジネスの傾向分析に役立ちます。</li>
<li><strong>比較分析</strong>: 異なる店舗間や商品間でのパフォーマンス比較、時系列での変化の追跡などが容易になり、データに基づいた意思決定をサポートします。</li>
</ul>
<p>売上データを例に、pandas MultiIndex の基本的な考え方から、データの準備、選択、集計、そして操作方法までを、具体的なコードを通して学んでいきましょう！</p>

<p>▶️ MultiIndexの公式ドキュメントも参考にしてください：<br /><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.MultiIndex.html" target="_blank">pandas.MultiIndex Documentation</a></p>
 


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-13" checked><label class="toc-title" for="toc-checkbox-13">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Pandas MultiIndex (階層型インデックス) の作成方法とサンプルデータ</a><ol><li><a href="#toc2" tabindex="0">サンプルデータの作成</a></li><li><a href="#toc3" tabindex="0">行方向への階層型インデックス（pandas MultiIndex）の設定 (set_index)</a></li></ol></li><li><a href="#toc4" tabindex="0">Pandas MultiIndex DataFrame からのデータ選択・絞り込み (loc, iloc)</a><ol><li><a href="#toc5" tabindex="0">特定の列（カラム）の選択</a><ol><li><a href="#toc6" tabindex="0">単一列の選択</a></li><li><a href="#toc7" tabindex="0">複数列の選択</a></li></ol></li><li><a href="#toc8" tabindex="0">特定の行の位置による選択 (.iloc)</a></li></ol></li><li><a href="#toc9" tabindex="0">階層型インデックス（pandas MultiIndex）を使ったラベルによるデータの選択・絞り込み (.loc)</a><ol><li><a href="#toc10" tabindex="0">複数レベルのインデックスラベルによる特定の組み合わせの選択</a></li><li><a href="#toc11" tabindex="0">複数レベルにまたがる要素の選択 (slice(None)の活用)</a></li><li><a href="#toc12" tabindex="0">単一レベルのインデックスラベルによる選択</a></li><li><a href="#toc13" tabindex="0">.loc使用時のパフォーマンスに関する注意点 (PerformanceWarningとsort_index)</a></li></ol></li><li><a href="#toc14" tabindex="0">Pandas MultiIndex を使った高度なデータ抽出・絞り込み</a><ol><li><a href="#toc15" tabindex="0">特定の月と店舗のデータを絞り込む</a></li></ol></li><li><a href="#toc16" tabindex="0">Pandas MultiIndex でのデータ集計 (groupby level)</a><ol><li><a href="#toc17" tabindex="0">単一インデックスレベルでの集計 (例: 店舗別)</a><ol><li><a href="#toc18" tabindex="0">【補足】groupbyのaxis引数に関する警告について</a></li></ol></li><li><a href="#toc19" tabindex="0">単一インデックスレベルでの集計 (例: 月別)</a></li><li><a href="#toc20" tabindex="0">複数インデックスレベルでの集計 (例: 月と店舗別)</a></li></ol></li><li><a href="#toc21" tabindex="0">MultiIndex のリセットと削除</a><ol><li><a href="#toc22" tabindex="0">階層型インデックス（pandas MultiIndex）のリセット (reset_index)</a></li></ol></li><li><a href="#toc23" tabindex="0">まとめ: Pandas MultiIndex を使いこなしてデータ分析を効率化</a><ol><li><a href="#toc24" tabindex="0">次のステップ</a></li><li><a href="#toc25" tabindex="0">関連記事</a></li><li><a href="#toc26" tabindex="0">MultiIndexとは何ですか？</a></li><li><a href="#toc27" tabindex="0">MultiIndexを作成する方法は？</a></li><li><a href="#toc28" tabindex="0">stack/unstackの役割は？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">Pandas MultiIndex (階層型インデックス) の作成方法とサンプルデータ</span></h2>
<h3><span id="toc2">サンプルデータの作成</span></h3>
<pre class="language-python" data-prismjs-copy><code class="language-python">
import pandas as pd
</code></pre>
<pre class="language-python" data-prismjs-copy><code class="language-python">
sales_data = {
    '月': ['2023-01', '2023-01', '2023-01', '2023-02', '2023-02', '2023-02', '2023-03', '2023-03','2023-03'],
    '店舗': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A'],
    '商品': ['りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'バナナ', 'りんご', 'バナナ', 'バナナ'],
    '売上（円）': [1000, 800, 1200, 900, 1100, 850, 1300, 950, 850],
    '売上原価（円）': [700, 500, 700, 600, 700, 400, 700, 550, 500]
}
sales_df = pd.DataFrame(sales_data)
display(sales_df)
</code></pre>

  <div id="df-ee5b1021-2339-4f18-856a-60cfbae28677" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>月</th>
      <th>店舗</th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>2023-01</td>
      <td>A</td>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2023-01</td>
      <td>A</td>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2023-01</td>
      <td>B</td>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2023-02</td>
      <td>B</td>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>4</th>
      <td>2023-02</td>
      <td>A</td>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>5</th>
      <td>2023-02</td>
      <td>A</td>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th>6</th>
      <td>2023-03</td>
      <td>B</td>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>7</th>
      <td>2023-03</td>
      <td>B</td>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>8</th>
      <td>2023-03</td>
      <td>A</td>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-ee5b1021-2339-4f18-856a-60cfbae28677')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-ee5b1021-2339-4f18-856a-60cfbae28677 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-ee5b1021-2339-4f18-856a-60cfbae28677');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-edfa0d27-1501-4d3e-b4db-67904dd65d72">
      <button class="colab-df-quickchart" onclick="quickchart('df-edfa0d27-1501-4d3e-b4db-67904dd65d72')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-edfa0d27-1501-4d3e-b4db-67904dd65d72 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_85b45709-9361-400b-ab6f-8f211413a6bd">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_85b45709-9361-400b-ab6f-8f211413a6bd button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<h3><span id="toc3">行方向への階層型インデックス（pandas MultiIndex）の設定 (set_index)</span></h3>
<p>階層型インデックス、すなわち pandas MultiIndex を設定することで、複数のカテゴリを組み合わせてデータを整理し、後の分析や絞り込みを効率的に行えるようになります。ここでは、&#8217;月&#8217;と&#8217;店舗&#8217;を組み合わせて行の pandas MultiIndex とします。</p>
<p><code>set_index()</code> メソッドに、pandas MultiIndex として設定したい列名のリストを渡すことで、階層型インデックスを持つ DataFrame を作成できます。元の列はインデックスに移動し、データ本体からは削除されます。</p>
<p>以下のコードを実行して、<code>sales_df</code> に pandas MultiIndex を適用した <code>sales_hier_df</code> を見てみましょう。行のインデックス部分が「月」と「店舗」の 2 つのレベルで構成されているのが分かります。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
# '月'と'店舗'を階層型インデックスに設定
sales_hier_df = sales_df.set_index(['月', '店舗'])
display(sales_hier_df)
</code></pre>

  <div id="df-e295bf0e-eb87-4273-bf8c-bc4e5a23be69" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-e295bf0e-eb87-4273-bf8c-bc4e5a23be69')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-e295bf0e-eb87-4273-bf8c-bc4e5a23be69 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-e295bf0e-eb87-4273-bf8c-bc4e5a23be69');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-77cfc9fc-5030-47c3-b1a6-08a455a35d05">
      <button class="colab-df-quickchart" onclick="quickchart('df-77cfc9fc-5030-47c3-b1a6-08a455a35d05')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-77cfc9fc-5030-47c3-b1a6-08a455a35d05 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_53c4fafa-9a50-41f3-8ffb-cfa1abf89e0f">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_53c4fafa-9a50-41f3-8ffb-cfa1abf89e0f button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<h2><span id="toc4">Pandas MultiIndex DataFrame からのデータ選択・絞り込み (loc, iloc)</span></h2>
<h3><span id="toc5">特定の列（カラム）の選択</span></h3>
<h4><span id="toc6">単一列の選択</span></h4>
<p>pandas MultiIndex を持つ DataFrame から、特定の列を選択するのは通常の DataFrame と同じように行えます。ここでは例として、&#8217;商品&#8217;列のみを絞り込んで表示してみましょう。</p>
<p>列を一つだけ選択する場合は、DataFrame 名の後に角括弧 <code>[]</code> で列名を指定します。結果は Series として返されます。</p>
<p>以下のコードを実行すると、元の DataFrame と比較して、「商品」列だけが抽出された Series が表示されます。インデックスは pandas MultiIndex (<code>月</code>, <code>店舗</code>) がそのまま引き継がれていることが分かります。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('絞り込み前')
display(sales_hier_df)

print('絞り込み後')
# グループの絞り込み
display(sales_hier_df['商品'])
</code></pre>
<pre>絞り込み前
</pre>

  <div id="df-514fadbc-a77f-47fb-a558-1198cd7b5567" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-514fadbc-a77f-47fb-a558-1198cd7b5567')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-514fadbc-a77f-47fb-a558-1198cd7b5567 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-514fadbc-a77f-47fb-a558-1198cd7b5567');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-a77ae6cc-17bd-48f9-93e5-ce8ac09e9830">
      <button class="colab-df-quickchart" onclick="quickchart('df-a77ae6cc-17bd-48f9-93e5-ce8ac09e9830')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-a77ae6cc-17bd-48f9-93e5-ce8ac09e9830 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_b0dc3b71-4fa0-46b7-bea3-c19096d6356c">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_b0dc3b71-4fa0-46b7-bea3-c19096d6356c button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>絞り込み後
</pre>
<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
    </tr>
  </tbody>
</table>
</div><br><label><b>dtype:</b> object</label>
<p>なお、</p>
<p><code>`</code></p>
<p>sales_hier_df.loc[:,&#8217;商品&#8217;]</p>
<p><code>`</code></p>
<p>にしても同じ結果が返ります。</p>
<h4><span id="toc7">複数列の選択</span></h4>
<p>複数の列を選択したい場合は、列名のリストを角括弧 <code>[]</code> の中に指定します。結果は DataFrame として返されます。ここでは例として、&#8217;商品&#8217;列と&#8217;売上（円）&#8217;列を同時に絞り込んで表示してみましょう。</p>
<p>以下のコードを実行すると、元の DataFrame から「商品」と「売上（円）」の 2 つの列だけが抽出された DataFrame が表示されます。行の階層型インデックス (<code>月</code>, <code>店舗</code>) は維持されています。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('絞り込み前')
display(sales_hier_df)

print('絞り込み後')
# グループの絞り込み
display(sales_hier_df[['商品','売上（円）']])
</code></pre>
<pre>絞り込み前
</pre>

  <div id="df-f4e20075-6520-4aae-9f53-be99779d2f9d" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-f4e20075-6520-4aae-9f53-be99779d2f9d')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-f4e20075-6520-4aae-9f53-be99779d2f9d button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-f4e20075-6520-4aae-9f53-be99779d2f9d');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-2c9cf78b-e592-4309-9896-34e2187c2659">
      <button class="colab-df-quickchart" onclick="quickchart('df-2c9cf78b-e592-4309-9896-34e2187c2659')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-2c9cf78b-e592-4309-9896-34e2187c2659 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_322116d0-cede-4c32-b292-9ca06fab3baa">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_322116d0-cede-4c32-b292-9ca06fab3baa button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>絞り込み後
</pre>

  <div id="df-2612edca-9c75-4c5b-a32a-56fc592ea131" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-2612edca-9c75-4c5b-a32a-56fc592ea131')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-2612edca-9c75-4c5b-a32a-56fc592ea131 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-2612edca-9c75-4c5b-a32a-56fc592ea131');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-ff1163f1-d395-4a58-9981-d55b34b3ad80">
      <button class="colab-df-quickchart" onclick="quickchart('df-ff1163f1-d395-4a58-9981-d55b34b3ad80')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-ff1163f1-d395-4a58-9981-d55b34b3ad80 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<p>なお、</p>
<p><code>`</code></p>
<p>sales_hier_df.loc[:,[&#8216;商品&#8217;,&#8217;売上（円）&#8217;]]</p>
<p><code>`</code></p>
<p>にしても同じ結果が返ります。</p>
<h3><span id="toc8">特定の行の位置による選択 (.iloc)</span></h3>
<p>pandas MultiIndex を持つ DataFrame から特定の行を選択するにはいくつかの方法があります。ここでは、行の<strong>位置</strong>（0 から始まる整数）を使って絞り込む方法を見てみましょう。<code>.iloc</code> アクセサを使用します。</p>
<p>スライスを使うことで、特定の範囲の行を選択できます。例えば、最初の 1 行を選択するには <code>iloc[0:1]</code> と指定します。これは、0 番目の行を含み、1 番目の行を含まない範囲を指定していることになります。</p>
<p>位置による選択は、データの物理的な並び順に基づいて行を選択したい場合に便利です。以下のコードでは、最初の 1 行目を取得しています。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('絞り込み前')
display(sales_hier_df)

print('絞り込み後')
# グループの絞り込み
display(sales_hier_df[0:1])
</code></pre>
<pre>絞り込み前
</pre>

  <div id="df-a06459c8-04c6-4615-825a-d2d492f107f1" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-a06459c8-04c6-4615-825a-d2d492f107f1')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-a06459c8-04c6-4615-825a-d2d492f107f1 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-a06459c8-04c6-4615-825a-d2d492f107f1');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-564f50d6-87d0-4e1f-8a88-8168b13a71b3">
      <button class="colab-df-quickchart" onclick="quickchart('df-564f50d6-87d0-4e1f-8a88-8168b13a71b3')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-564f50d6-87d0-4e1f-8a88-8168b13a71b3 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_7361b3f0-79fb-44d1-bf75-f7a65b925c6f">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_7361b3f0-79fb-44d1-bf75-f7a65b925c6f button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>絞り込み後
</pre>

  <div id="df-ee1a70c7-9a00-4c87-acc8-677a3395ccb0" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-ee1a70c7-9a00-4c87-acc8-677a3395ccb0')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-ee1a70c7-9a00-4c87-acc8-677a3395ccb0 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-ee1a70c7-9a00-4c87-acc8-677a3395ccb0');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    </div>
  </div>

<p>また、２番目の行のデータを見たいならば、</p>
<p><code>`</code></p>
<p>sales_hier_df[2:3]</p>
<p><code>`</code></p>
<p>にすると、グループの絞り込みができます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('絞り込み前')
display(sales_hier_df)

print('絞り込み後')
# グループの絞り込み
display(sales_hier_df[2:3])
</code></pre>
<pre>絞り込み前
</pre>

  <div id="df-ac9accfc-27d3-4f84-98f9-a4a1579e4742" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-ac9accfc-27d3-4f84-98f9-a4a1579e4742')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-ac9accfc-27d3-4f84-98f9-a4a1579e4742 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-ac9accfc-27d3-4f84-98f9-a4a1579e4742');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-db60d182-c33a-4af6-a69d-c506ff0752e9">
      <button class="colab-df-quickchart" onclick="quickchart('df-db60d182-c33a-4af6-a69d-c506ff0752e9')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-db60d182-c33a-4af6-a69d-c506ff0752e9 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_4d049cba-4feb-4175-9c23-694f19c3b4b5">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_4d049cba-4feb-4175-9c23-694f19c3b4b5 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>絞り込み後
</pre>

  <div id="df-b0c2aa5a-802a-45f5-bd82-5507c16cd4b5" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2023-01</th>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-b0c2aa5a-802a-45f5-bd82-5507c16cd4b5')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-b0c2aa5a-802a-45f5-bd82-5507c16cd4b5 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-b0c2aa5a-802a-45f5-bd82-5507c16cd4b5');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    </div>
  </div>

<h2><span id="toc9">階層型インデックス（pandas MultiIndex）を使ったラベルによるデータの選択・絞り込み (.loc)</span></h2>
<p>特定の行（インデックスラベル）を選択する際には、<code>.loc</code> アクセサを使用します。pandas MultiIndex では、この <code>.loc</code> を使って柔軟な絞り込みが可能です。</p>
<h3><span id="toc10">複数レベルのインデックスラベルによる特定の組み合わせの選択</span></h3>
<p>例えば、「2023 年 1 月の A 店」のように、pandas MultiIndex の複数レベル（&#8217;月&#8217;と&#8217;店舗&#8217;）の特定の組み合わせに一致する行を絞り込みたい場合、<code>.loc</code>にタプルで指定します。</p>
<p>以下のコードを実行すると、<code>('2023-01', 'A')</code> のラベルに一致する行が抽出されます。この場合、2023 年 1 月の A 店のデータがすべて表示されます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('絞り込み前')
display(sales_hier_df)

print('特定の月と店舗で絞り込み (例: 2023-01 の A 店)')
display(sales_hier_df.loc[('2023-01', 'A')])
</code></pre>
<pre>絞り込み前
</pre>

  <div id="df-210907b3-a09d-4817-8d5c-050efccbeb7d" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-210907b3-a09d-4817-8d5c-050efccbeb7d')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-210907b3-a09d-4817-8d5c-050efccbeb7d button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-210907b3-a09d-4817-8d5c-050efccbeb7d');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-0c67fe48-54ff-4ce6-9eed-801b54ff8dda">
      <button class="colab-df-quickchart" onclick="quickchart('df-0c67fe48-54ff-4ce6-9eed-801b54ff8dda')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-0c67fe48-54ff-4ce6-9eed-801b54ff8dda button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_0b1ba9a4-a96f-4082-ae5b-b91a70ceb718">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_0b1ba9a4-a96f-4082-ae5b-b91a70ceb718 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>特定の月と店舗で絞り込み (例: 2023-01 の A 店)
</pre>
<pre>/tmp/ipython-input-1872768620.py:5: PerformanceWarning: indexing past lexsort depth may impact performance.
  display(sales_hier_df.loc[('2023-01', 'A')])
</pre>

  <div id="df-24963cae-d0f4-4bad-8aa2-bca8db453226" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-24963cae-d0f4-4bad-8aa2-bca8db453226')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-24963cae-d0f4-4bad-8aa2-bca8db453226 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-24963cae-d0f4-4bad-8aa2-bca8db453226');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-41fed59e-5c25-4735-8c68-5ff13f46a3e1">
      <button class="colab-df-quickchart" onclick="quickchart('df-41fed59e-5c25-4735-8c68-5ff13f46a3e1')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-41fed59e-5c25-4735-8c68-5ff13f46a3e1 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h3><span id="toc11">複数レベルにまたがる要素の選択 (slice(None)の活用)</span></h3>
<p>特定のレベルの全ての要素を選択しつつ、別のレベルで絞り込みたい場合は、<code>slice(None)</code> を使用します。例えば、全ての月の&#8217;A&#8217;店のデータを取得するには <code>.loc[(slice(None), 'A'), :]</code> と指定します。<code>slice(None)</code> はそのレベルの全ての要素を選択することを意味します。</p>
<p>以下のコードを実行すると、月のレベルは全て選択し、店舗レベルで &#8216;A&#8217; を選択したデータが表示されます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('絞り込み前')
display(sales_hier_df)

print('特定の店舗で絞り込み (例: A 店の全ての月)')
display(sales_hier_df.loc[(slice(None), 'A'), :])
</code></pre>
<pre>絞り込み前
</pre>

  <div id="df-93cc3668-3f67-496e-bd95-536a1cb336b9" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-93cc3668-3f67-496e-bd95-536a1cb336b9')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-93cc3668-3f67-496e-bd95-536a1cb336b9 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-93cc3668-3f67-496e-bd95-536a1cb336b9');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-bbfb3c27-7c86-4779-9f7e-84b39ab109da">
      <button class="colab-df-quickchart" onclick="quickchart('df-bbfb3c27-7c86-4779-9f7e-84b39ab109da')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-bbfb3c27-7c86-4779-9f7e-84b39ab109da button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_9a7602b2-fef6-46f9-a310-174575d3a48b">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_9a7602b2-fef6-46f9-a310-174575d3a48b button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>特定の店舗で絞り込み (例: A 店の全ての月)
</pre>

  <div id="df-81ad1e0c-0989-4cc2-9cc3-490602d3bf25" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">2023-02</th>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th>2023-03</th>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-81ad1e0c-0989-4cc2-9cc3-490602d3bf25')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-81ad1e0c-0989-4cc2-9cc3-490602d3bf25 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-81ad1e0c-0989-4cc2-9cc3-490602d3bf25');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-cb540b23-d395-45ca-b6cb-28a383610c94">
      <button class="colab-df-quickchart" onclick="quickchart('df-cb540b23-d395-45ca-b6cb-28a383610c94')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-cb540b23-d395-45ca-b6cb-28a383610c94 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h3><span id="toc12">単一レベルのインデックスラベルによる選択</span></h3>
<p><code>.loc</code> を使用すると、pandas MultiIndex の特定のレベルのラベルを指定して行を選択できます。例えば、最初のレベルである &#8216;月&#8217; のラベルを指定して、特定の月のデータを全て選択することができます。</p>
<p>また、特定の行（インデックスラベル）と特定の列（カラム名）を組み合わせて絞り込むことも可能です。<code>.loc[行の指定, 列の指定]</code> の形式で記述します。</p>
<p>ここではたとえば、&#8217;2023-01&#8217;の全ての店舗のデータから、&#8217;商品&#8217;列だけを見たいとしましょう。行の指定には <code>'2023-01'</code> を、列の指定には <code>'商品'</code> を使います。単一レベルのラベルを指定する場合は、タプルではなく直接ラベル名を指定するか、単一要素のタプル <code>('2023-01',)</code> とします。</p>
<p>以下のコードを実行すると、2023 年 1 月の全ての店舗のデータの中から、「商品」列だけが抽出されます。結果は Series として表示されます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('絞り込み前')
display(sales_hier_df)

print('絞り込み後（2023-01の全店舗の商品列を絞り込み）')
# 行の指定にタプル ('2023-01',) を使い、列の指定に '商品' を使う
display(sales_hier_df.loc[('2023-01',), '商品'])
</code></pre>
<pre>絞り込み前
</pre>

  <div id="df-ef1bd756-5184-49ce-8fd6-184b775a9391" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-ef1bd756-5184-49ce-8fd6-184b775a9391')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-ef1bd756-5184-49ce-8fd6-184b775a9391 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-ef1bd756-5184-49ce-8fd6-184b775a9391');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-5390efda-7132-4439-b17a-a5dbd4e78336">
      <button class="colab-df-quickchart" onclick="quickchart('df-5390efda-7132-4439-b17a-a5dbd4e78336')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-5390efda-7132-4439-b17a-a5dbd4e78336 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_151eaa96-1fb4-43bd-91ee-3651f4bc4445">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_151eaa96-1fb4-43bd-91ee-3651f4bc4445 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>絞り込み後（2023-01の全店舗の商品列を絞り込み）
</pre>
<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>商品</th>
    </tr>
    <tr>
      <th>店舗</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>りんご</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
    </tr>
  </tbody>
</table>
</div><br><label><b>dtype:</b> object</label>
<h3><span id="toc13">.loc使用時のパフォーマンスに関する注意点 (PerformanceWarningとsort_index)</span></h3>
<p>pandas MultiIndex を持つ DataFrame で <code>.loc</code> アクセサを使ってラベルによる絞り込みを行う際に、時折 <code>PerformanceWarning</code> が表示されることがあります。これは、特にインデックスがソートされていない場合に発生し、データの検索効率が低下する可能性があることを示しています。</p>
<p><strong>この <code>PerformanceWarning</code> は、pandas MultiIndex を扱う上でよく遭遇するものであり、インデックスがソートされていない状態で特定のラベルやスライスによる選択を行う際に発生します。</strong></p>
<p>Pandas は、ソートされたインデックスに対しては非常に高速な検索アルゴリズムを使用できますが、ソートされていない場合は、各インデックスエントリを個別にチェックする必要があり、特に大規模なデータでは処理時間が長くなることがあります。</p>
<p>このパフォーマンスの問題を解決し、<code>PerformanceWarning</code> を回避するためには、<code>.loc</code> を使用して絞り込みを行う前に、DataFrame のインデックスを <code>sort_index()</code> メソッドでソートすることが推奨されます。<code>sort_index()</code> は、インデックスの各レベルを順番にソートし、効率的なデータアクセスを可能にします。</p>
<p><strong>したがって、pandas MultiIndex を使った <code>.loc</code> によるデータ選択を行う際は、事前に <code>sort_index()</code> を実行することが、パフォーマンスを最適化し、警告を回避するための標準的なプラクティスとなります。</strong></p>
<p>ソートされたインデックスを持つ DataFrame では、特定のラベルやスライスによる <code>.loc</code> での選択が高速化され、警告も表示されなくなります。</p>
<p>以下のコードでは、まずソート前の DataFrame で特定の絞り込みを行い、<code>PerformanceWarning</code> が表示される場合があることを確認します。次に、インデックスをソートした DataFrame で同じ絞り込みを行い、警告が表示されないこと、および結果が変わらないことを確認します。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('ソート前')
display(sales_hier_df)

# インデックスをソート
sales_hier_sorted_df = sales_hier_df.sort_index()

print('インデックスをソート後')
display(sales_hier_sorted_df)

print('ソート済みDataFrameで特定の月と店舗で絞り込み (例: 2023-01 の A 店)')
display(sales_hier_sorted_df.loc[('2023-01', 'A')])

print('ソート済みDataFrameで特定の店舗で絞り込み (例: A 店の全ての月)')
display(sales_hier_sorted_df.loc[(slice(None), 'A'), :])
</code></pre>
<pre>ソート前
</pre>

  <div id="df-e8e79a10-b6e9-49e5-bccc-60ef837b723a" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-e8e79a10-b6e9-49e5-bccc-60ef837b723a')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-e8e79a10-b6e9-49e5-bccc-60ef837b723a button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-e8e79a10-b6e9-49e5-bccc-60ef837b723a');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-53785a63-6980-4bab-a5e0-6e67360e7350">
      <button class="colab-df-quickchart" onclick="quickchart('df-53785a63-6980-4bab-a5e0-6e67360e7350')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-53785a63-6980-4bab-a5e0-6e67360e7350 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_6a516ddf-6882-4f22-9f91-cdf075f46c63">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_6a516ddf-6882-4f22-9f91-cdf075f46c63 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>インデックスをソート後
</pre>

  <div id="df-87758a97-004d-4bee-a85c-65cca4bdfb97" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-87758a97-004d-4bee-a85c-65cca4bdfb97')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-87758a97-004d-4bee-a85c-65cca4bdfb97 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-87758a97-004d-4bee-a85c-65cca4bdfb97');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-e67bf601-7a79-4e68-b1dc-bb137905fdff">
      <button class="colab-df-quickchart" onclick="quickchart('df-e67bf601-7a79-4e68-b1dc-bb137905fdff')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-e67bf601-7a79-4e68-b1dc-bb137905fdff button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_f1274bd3-6a5a-4561-8694-13cd44531d0b">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_sorted_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_f1274bd3-6a5a-4561-8694-13cd44531d0b button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_sorted_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>ソート済みDataFrameで特定の月と店舗で絞り込み (例: 2023-01 の A 店)
</pre>

  <div id="df-81d1211c-cd02-4af7-81af-8b48f0ac8e39" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-81d1211c-cd02-4af7-81af-8b48f0ac8e39')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-81d1211c-cd02-4af7-81af-8b48f0ac8e39 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-81d1211c-cd02-4af7-81af-8b48f0ac8e39');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-d96fd346-61b6-4907-ab49-c6be3ee40354">
      <button class="colab-df-quickchart" onclick="quickchart('df-d96fd346-61b6-4907-ab49-c6be3ee40354')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-d96fd346-61b6-4907-ab49-c6be3ee40354 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<pre>ソート済みDataFrameで特定の店舗で絞り込み (例: A 店の全ての月)
</pre>

  <div id="df-9e617980-0c92-4f18-b215-a7b83266001b" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">2023-02</th>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th>2023-03</th>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-9e617980-0c92-4f18-b215-a7b83266001b')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-9e617980-0c92-4f18-b215-a7b83266001b button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-9e617980-0c92-4f18-b215-a7b83266001b');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-1a065139-8728-4245-b453-eba0b9c90a94">
      <button class="colab-df-quickchart" onclick="quickchart('df-1a065139-8728-4245-b453-eba0b9c90a94')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-1a065139-8728-4245-b453-eba0b9c90a94 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h2><span id="toc14">Pandas MultiIndex を使った高度なデータ抽出・絞り込み</span></h2>
<p>pandas MultiIndex の強力な点は、単一のレベルだけでなく、複数のレベルを組み合わせてデータを柔軟に絞り込めることです。<code>.loc</code>を使用することで、インデックスの特定の組み合わせや、特定のレベルのすべての要素を選択しながら別のレベルで絞り込むといった、より複雑な条件でのデータ抽出が容易になります。</p>
<h3><span id="toc15">特定の月と店舗のデータを絞り込む</span></h3>
<p>例えば、「2023 年 2 月の A 店」のように、pandas MultiIndex の複数レベル（&#8217;月&#8217;と&#8217;店舗&#8217;）の特定の組み合わせに一致する行を絞り込みたい場合、<code>.loc</code>にタプルで指定します。</p>
<p>以下のコードを実行すると、2023 年 2 月の A 店のデータのみが抽出されます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('階層型インデックスDataFrame')
display(sales_hier_df)

print("特定の月 ('2023-02') かつ特定の店舗 ('A') のデータを絞り込み:")
display(sales_hier_df.loc[('2023-02', 'A')])

print("特定の月 ('2023-03') における特定の商品のデータ ('バナナ') を全ての店舗で絞り込み:")
display(sales_hier_df.loc[(slice(None), slice(None)), :][sales_hier_df['商品'] == 'バナナ'].loc['2023-03'])
</code></pre>
<pre>階層型インデックスDataFrame
</pre>

  <div id="df-c1f76cad-2c9c-4250-8eb1-f0573eb13c09" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-c1f76cad-2c9c-4250-8eb1-f0573eb13c09')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-c1f76cad-2c9c-4250-8eb1-f0573eb13c09 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-c1f76cad-2c9c-4250-8eb1-f0573eb13c09');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-eab6596d-7503-4504-acda-3ddc82b3aa50">
      <button class="colab-df-quickchart" onclick="quickchart('df-eab6596d-7503-4504-acda-3ddc82b3aa50')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-eab6596d-7503-4504-acda-3ddc82b3aa50 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_38258474-3f1a-40f6-8102-522e4332f638">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_38258474-3f1a-40f6-8102-522e4332f638 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>特定の月 ('2023-02') かつ特定の店舗 ('A') のデータを絞り込み:
</pre>
<pre>/tmp/ipython-input-3881532412.py:5: PerformanceWarning: indexing past lexsort depth may impact performance.
  display(sales_hier_df.loc[('2023-02', 'A')])
</pre>

  <div id="df-36cacea2-814f-4033-a838-a81cd03413ab" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">2023-02</th>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-36cacea2-814f-4033-a838-a81cd03413ab')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-36cacea2-814f-4033-a838-a81cd03413ab button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-36cacea2-814f-4033-a838-a81cd03413ab');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-fa72b98b-a5a2-470b-b7ab-179e2c69450d">
      <button class="colab-df-quickchart" onclick="quickchart('df-fa72b98b-a5a2-470b-b7ab-179e2c69450d')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-fa72b98b-a5a2-470b-b7ab-179e2c69450d button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<pre>特定の月 ('2023-03') における特定の商品のデータ ('バナナ') を全ての店舗で絞り込み:
</pre>

  <div id="df-14451989-c889-4c97-9acd-01be25302584" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-14451989-c889-4c97-9acd-01be25302584')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-14451989-c889-4c97-9acd-01be25302584 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-14451989-c889-4c97-9acd-01be25302584');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-5fc20d71-10eb-4f1a-bd3b-68bd2750ff1a">
      <button class="colab-df-quickchart" onclick="quickchart('df-5fc20d71-10eb-4f1a-bd3b-68bd2750ff1a')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-5fc20d71-10eb-4f1a-bd3b-68bd2750ff1a button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h2><span id="toc16">Pandas MultiIndex でのデータ集計 (groupby level)</span></h2>
<p>pandas MultiIndex を設定することで、特定のインデックスレベルを基準にしてデータを簡単に集計できます。<code>groupby()</code> メソッドと <code>level</code> 引数を使うことで、指定したレベルでデータをグループ化し、合計や平均などの集計関数を適用できます。</p>
<p>以下の例では、様々な pandas MultiIndex レベルを軸に売上と売上原価の合計を計算しています。集計対象から文字列型の&#8217;商品&#8217;列を除外するために、数値列のみを選択して集計しています。</p>
<h3><span id="toc17">単一インデックスレベルでの集計 (例: 店舗別)</span></h3>
<p>&#8216;店舗&#8217;を軸に売上と売上原価の合計を計算します。<code>groupby(level='店舗')</code> で店舗ごとにデータをグループ化し、<code>.sum()</code> で各グループの合計値を計算しています。集計結果からは、例えば「A 店の総売上は〇〇円、B 店の総売上は△△円である」といった情報を読み取ることができます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('合計前')
display(sales_hier_df)

print('店舗ごとの合計')
display(sales_hier_df.groupby(level= '店舗', axis = 0).sum())

print('店舗ごとの合計（商品を除く)')
display(sales_hier_df[['売上（円）','売上原価（円）']].groupby(level= '店舗', axis = 0).sum())
</code></pre>
<pre>合計前
</pre>

  <div id="df-978d2e48-7f14-4365-bb87-ef3dafad1360" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-978d2e48-7f14-4365-bb87-ef3dafad1360')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-978d2e48-7f14-4365-bb87-ef3dafad1360 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-978d2e48-7f14-4365-bb87-ef3dafad1360');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-067ade19-0729-4420-a2b3-8b196218428c">
      <button class="colab-df-quickchart" onclick="quickchart('df-067ade19-0729-4420-a2b3-8b196218428c')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-067ade19-0729-4420-a2b3-8b196218428c button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_e2b2a7f4-f20e-421b-8f25-1669671fd8fa">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_e2b2a7f4-f20e-421b-8f25-1669671fd8fa button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>店舗ごとの合計
</pre>
<pre>/tmp/ipython-input-3547325012.py:5: FutureWarning: The 'axis' keyword in DataFrame.groupby is deprecated and will be removed in a future version.
  display(sales_hier_df.groupby(level= '店舗', axis = 0).sum())
</pre>

  <div id="df-472724ff-51cc-4def-9022-e558c8776e4a" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>りんごバナナりんごバナナバナナ</td>
      <td>4600</td>
      <td>2800</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんごバナナりんごバナナ</td>
      <td>4350</td>
      <td>2550</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-472724ff-51cc-4def-9022-e558c8776e4a')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-472724ff-51cc-4def-9022-e558c8776e4a button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-472724ff-51cc-4def-9022-e558c8776e4a');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-0e39471a-36f7-451e-8d58-9cec67ad3eef">
      <button class="colab-df-quickchart" onclick="quickchart('df-0e39471a-36f7-451e-8d58-9cec67ad3eef')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-0e39471a-36f7-451e-8d58-9cec67ad3eef button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<pre>店舗ごとの合計（商品を除く)
</pre>
<pre>/tmp/ipython-input-3547325012.py:8: FutureWarning: The 'axis' keyword in DataFrame.groupby is deprecated and will be removed in a future version.
  display(sales_hier_df[['売上（円）','売上原価（円）']].groupby(level= '店舗', axis = 0).sum())
</pre>

  <div id="df-1a301198-936f-40a4-912c-3252787b3103" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>店舗</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>4600</td>
      <td>2800</td>
    </tr>
    <tr>
      <th>B</th>
      <td>4350</td>
      <td>2550</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-1a301198-936f-40a4-912c-3252787b3103')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-1a301198-936f-40a4-912c-3252787b3103 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-1a301198-936f-40a4-912c-3252787b3103');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-85d5fbd3-c11b-4201-b027-2f3990cff300">
      <button class="colab-df-quickchart" onclick="quickchart('df-85d5fbd3-c11b-4201-b027-2f3990cff300')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-85d5fbd3-c11b-4201-b027-2f3990cff300 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h4><span id="toc18">【補足】groupbyのaxis引数に関する警告について</span></h4>
<p>上記のコードを実行すると、FutureWarning: The &#8216;axis&#8217; keyword in DataFrame.groupby is deprecated and will be removed in a future version. という警告が表示されることがあります。これは、将来的にgroupbyメソッドでaxisを使う方法が廃止される可能性があることを示しています。</p>
<p>現在（pandas の特定のバージョン）ではまだ動作しますが、将来的な互換性を考慮すると、axis=0の場合は引数を省略するか、列方向の集計（axis=1）の場合は groupby(level=&#8217;color&#8217;, axis=1) の代わりに、データの持ち方によっては先にデータを転置（.T）してからgroupbyを行うなどの代替手段を検討することもできます。</p>
<p>なお、groupbyメソッドでaxis=0を指定することは、デフォルトの動作である「行方向（インデックス）でのグループ化」を明示していることになります。このため、通常はaxis=0を省略しても同じ結果が得られます。警告を避けるためにも、行方向のグループ化の場合はaxis引数を省略することが推奨されます。</p>
<h3><span id="toc19">単一インデックスレベルでの集計 (例: 月別)</span></h3>
<p>次に、&#8217;月&#8217;を軸に売上と売上原価の合計を計算してみましょう。<code>groupby(level='月')</code> を使用します。これにより、月ごとの全体の売上動向を把握できます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('合計前')
display(sales_hier_df)

print('月ごとの合計')
# 警告を避けるため、axis=0 は省略
display(sales_hier_df[['売上（円）','売上原価（円）']].groupby(level= ['月']).sum())
</code></pre>
<pre>合計前
</pre>

  <div id="df-be005521-f341-4383-b080-96d01fa1efb0" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-be005521-f341-4383-b080-96d01fa1efb0')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-be005521-f341-4383-b080-96d01fa1efb0 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-be005521-f341-4383-b080-96d01fa1efb0');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-059ce6b4-caa8-494a-b25f-00d6bbf70791">
      <button class="colab-df-quickchart" onclick="quickchart('df-059ce6b4-caa8-494a-b25f-00d6bbf70791')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-059ce6b4-caa8-494a-b25f-00d6bbf70791 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_deef470d-9fc9-488d-8879-09804f843b3f">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_deef470d-9fc9-488d-8879-09804f843b3f button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>月ごとの合計
</pre>

  <div id="df-3ea9377a-58c3-442a-8bed-c5cd26a02059" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2023-01</th>
      <td>3000</td>
      <td>1900</td>
    </tr>
    <tr>
      <th>2023-02</th>
      <td>2850</td>
      <td>1700</td>
    </tr>
    <tr>
      <th>2023-03</th>
      <td>3100</td>
      <td>1750</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-3ea9377a-58c3-442a-8bed-c5cd26a02059')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-3ea9377a-58c3-442a-8bed-c5cd26a02059 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-3ea9377a-58c3-442a-8bed-c5cd26a02059');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-03c33d58-22ac-4613-b2e3-e794711c92a3">
      <button class="colab-df-quickchart" onclick="quickchart('df-03c33d58-22ac-4613-b2e3-e794711c92a3')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-03c33d58-22ac-4613-b2e3-e794711c92a3 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h3><span id="toc20">複数インデックスレベルでの集計 (例: 月と店舗別)</span></h3>
<p>さらに、&#8217;月&#8217;と&#8217;店舗&#8217;の両方を軸にして集計することも可能です。<code>groupby(level=['月', '店舗'])</code> のようにレベル名のリストを指定します。これにより、各月における各店舗の合計売上を詳細に分析できます。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('合計前')
display(sales_hier_df)

print('月と店舗ごとの合計')
# 警告を避けるため、axis=0 は省略
display(sales_hier_df[['売上（円）','売上原価（円）']].groupby(level= ['月', '店舗']).sum())
</code></pre>
<pre>合計前
</pre>

  <div id="df-779398bf-1d8e-4703-b5d7-b6313654aadd" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-779398bf-1d8e-4703-b5d7-b6313654aadd')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-779398bf-1d8e-4703-b5d7-b6313654aadd button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-779398bf-1d8e-4703-b5d7-b6313654aadd');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-2d5b62c5-69ab-41e3-b9c9-1355366342a6">
      <button class="colab-df-quickchart" onclick="quickchart('df-2d5b62c5-69ab-41e3-b9c9-1355366342a6')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-2d5b62c5-69ab-41e3-b9c9-1355366342a6 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_75802701-705c-40af-8332-1531dde30494">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_75802701-705c-40af-8332-1531dde30494 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>月と店舗ごとの合計
</pre>

  <div id="df-cf4609f1-0b80-4aa3-a48f-ce41b816722b" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">2023-01</th>
      <th>A</th>
      <td>1800</td>
      <td>1200</td>
    </tr>
    <tr>
      <th>B</th>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">2023-02</th>
      <th>A</th>
      <td>1950</td>
      <td>1100</td>
    </tr>
    <tr>
      <th>B</th>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">2023-03</th>
      <th>A</th>
      <td>850</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>2250</td>
      <td>1250</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-cf4609f1-0b80-4aa3-a48f-ce41b816722b')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-cf4609f1-0b80-4aa3-a48f-ce41b816722b button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-cf4609f1-0b80-4aa3-a48f-ce41b816722b');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-dd6244bd-97c9-4241-aced-338027c6a193">
      <button class="colab-df-quickchart" onclick="quickchart('df-dd6244bd-97c9-4241-aced-338027c6a193')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-dd6244bd-97c9-4241-aced-338027c6a193 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h2><span id="toc21">MultiIndex のリセットと削除</span></h2>
<p>pandas MultiIndex を持つ DataFrame から特定の行を削除したい場合は、<code>drop()</code> メソッドを使います。<code>drop()</code> に削除したいインデックスのラベルを指定します。階層型インデックスの場合は、削除したいレベルのラベルを指定します。</p>
<p>次の例では、月レベルのインデックスである&#8217;2023-03&#8217;に対応する全ての行を削除しています。これにより、特定の期間のデータを分析から除外したい場合などに便利です。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('削除前')
display(sales_hier_df)

print('2023-03行を削除後')
display(sales_hier_df.drop(['2023-03']))
</code></pre>
<pre>削除前
</pre>

  <div id="df-0b778a9f-ac0a-4916-8aa2-d03525aeacfa" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-0b778a9f-ac0a-4916-8aa2-d03525aeacfa')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-0b778a9f-ac0a-4916-8aa2-d03525aeacfa button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-0b778a9f-ac0a-4916-8aa2-d03525aeacfa');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-29781cd4-0726-4dd6-84fb-714d1f538e15">
      <button class="colab-df-quickchart" onclick="quickchart('df-29781cd4-0726-4dd6-84fb-714d1f538e15')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-29781cd4-0726-4dd6-84fb-714d1f538e15 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_6577a334-a7b9-467e-b0e5-9f9026e09018">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_6577a334-a7b9-467e-b0e5-9f9026e09018 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>2023-03行を削除後
</pre>

  <div id="df-20221ee5-deb8-4f3e-9a70-d587895f80df" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-20221ee5-deb8-4f3e-9a70-d587895f80df')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-20221ee5-deb8-4f3e-9a70-d587895f80df button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-20221ee5-deb8-4f3e-9a70-d587895f80df');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-b21ef3bd-da83-4c0a-b53d-94b7c6f98b5e">
      <button class="colab-df-quickchart" onclick="quickchart('df-b21ef3bd-da83-4c0a-b53d-94b7c6f98b5e')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-b21ef3bd-da83-4c0a-b53d-94b7c6f98b5e button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

    </div>
  </div>

<h3><span id="toc22">階層型インデックス（pandas MultiIndex）のリセット (reset_index)</span></h3>
<p>pandas MultiIndex を設定した DataFrame を、元のフラットなインデックスに戻したい場合があります。例えば、階層型インデックスで行った集計結果を、元の列として扱いたい場合などです。</p>
<p>このような場合は、<code>reset_index()</code> メソッドを使用します。このメソッドを呼び出すと、階層型インデックスの各レベルが通常の列として DataFrame に追加され、デフォルトの整数インデックスが新たに設定されます。</p>
<p><code>reset_index()</code> は新しい DataFrame を返すため、元の DataFrame を変更したい場合は、結果を同じ変数に代入するか、<code>inplace=True</code> 引数を指定します（ただし、<code>inplace=True</code> の使用は推奨されない場合があります）。</p>
<p>ここでは、<code>sales_hier_df</code> に設定した pandas MultiIndex をリセットし、&#8217;月&#8217;と&#8217;店舗&#8217;を再び列に戻してみましょう。元の <code>sales_df</code> と同じ形式に戻ることが分かります。</p>
<pre class="language-python" data-prismjs-copy><code class="language-python">
print('リセット前')
display(sales_hier_df)

print('インデックスをリセット後')
sales_reset_df = sales_hier_df.reset_index()
display(sales_reset_df)
</code></pre>
<pre>リセット前
</pre>

  <div id="df-893f24df-dc20-4095-871d-d41e9cf9354f" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th></th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
    <tr>
      <th>月</th>
      <th>店舗</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="3" valign="top">2023-01</th>
      <th>A</th>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>B</th>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-02</th>
      <th>B</th>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>A</th>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th rowspan="3" valign="top">2023-03</th>
      <th>B</th>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>B</th>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>A</th>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-893f24df-dc20-4095-871d-d41e9cf9354f')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-893f24df-dc20-4095-871d-d41e9cf9354f button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-893f24df-dc20-4095-871d-d41e9cf9354f');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-eac81b99-0a06-439d-a4ce-7da57311eb76">
      <button class="colab-df-quickchart" onclick="quickchart('df-eac81b99-0a06-439d-a4ce-7da57311eb76')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-eac81b99-0a06-439d-a4ce-7da57311eb76 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_8a8f65ba-d2ea-4455-b806-a9afae3f3b6a">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_hier_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_8a8f65ba-d2ea-4455-b806-a9afae3f3b6a button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_hier_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre>インデックスをリセット後
</pre>

  <div id="df-ed3ef606-76e6-4640-ac92-c83513da0105" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table class="wp-block-table" style="width: auto; border-collapse: collapse;" border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>月</th>
      <th>店舗</th>
      <th>商品</th>
      <th>売上（円）</th>
      <th>売上原価（円）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>2023-01</td>
      <td>A</td>
      <td>りんご</td>
      <td>1000</td>
      <td>700</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2023-01</td>
      <td>A</td>
      <td>バナナ</td>
      <td>800</td>
      <td>500</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2023-01</td>
      <td>B</td>
      <td>りんご</td>
      <td>1200</td>
      <td>700</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2023-02</td>
      <td>B</td>
      <td>バナナ</td>
      <td>900</td>
      <td>600</td>
    </tr>
    <tr>
      <th>4</th>
      <td>2023-02</td>
      <td>A</td>
      <td>りんご</td>
      <td>1100</td>
      <td>700</td>
    </tr>
    <tr>
      <th>5</th>
      <td>2023-02</td>
      <td>A</td>
      <td>バナナ</td>
      <td>850</td>
      <td>400</td>
    </tr>
    <tr>
      <th>6</th>
      <td>2023-03</td>
      <td>B</td>
      <td>りんご</td>
      <td>1300</td>
      <td>700</td>
    </tr>
    <tr>
      <th>7</th>
      <td>2023-03</td>
      <td>B</td>
      <td>バナナ</td>
      <td>950</td>
      <td>550</td>
    </tr>
    <tr>
      <th>8</th>
      <td>2023-03</td>
      <td>A</td>
      <td>バナナ</td>
      <td>850</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-ed3ef606-76e6-4640-ac92-c83513da0105')"
            title="Convert this dataframe to an interactive table."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"/>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-ed3ef606-76e6-4640-ac92-c83513da0105 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-ed3ef606-76e6-4640-ac92-c83513da0105');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    <div id="df-214258f7-d48c-405c-bb11-d0f467b805e6">
      <button class="colab-df-quickchart" onclick="quickchart('df-214258f7-d48c-405c-bb11-d0f467b805e6')"
                title="Suggest charts"
                style="display:none;">

<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
     width="24px">
    <g>
        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/>
    </g>
</svg>
      </button>

<style>
  .colab-df-quickchart {
      --bg-color: #E8F0FE;
      --fill-color: #1967D2;
      --hover-bg-color: #E2EBFA;
      --hover-fill-color: #174EA6;
      --disabled-fill-color: #AAA;
      --disabled-bg-color: #DDD;
  }

  [theme=dark] .colab-df-quickchart {
      --bg-color: #3B4455;
      --fill-color: #D2E3FC;
      --hover-bg-color: #434B5C;
      --hover-fill-color: #FFFFFF;
      --disabled-bg-color: #3B4455;
      --disabled-fill-color: #666;
  }

  .colab-df-quickchart {
    background-color: var(--bg-color);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    display: none;
    fill: var(--fill-color);
    height: 32px;
    padding: 0;
    width: 32px;
  }

  .colab-df-quickchart:hover {
    background-color: var(--hover-bg-color);
    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
    fill: var(--button-hover-fill-color);
  }

  .colab-df-quickchart-complete:disabled,
  .colab-df-quickchart-complete:disabled:hover {
    background-color: var(--disabled-bg-color);
    fill: var(--disabled-fill-color);
    box-shadow: none;
  }

  .colab-df-spinner {
    border: 2px solid var(--fill-color);
    border-color: transparent;
    border-bottom-color: var(--fill-color);
    animation:
      spin 1s steps(1) infinite;
  }

  @keyframes spin {
    0% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
      border-left-color: var(--fill-color);
    }
    20% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    30% {
      border-color: transparent;
      border-left-color: var(--fill-color);
      border-top-color: var(--fill-color);
      border-right-color: var(--fill-color);
    }
    40% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-top-color: var(--fill-color);
    }
    60% {
      border-color: transparent;
      border-right-color: var(--fill-color);
    }
    80% {
      border-color: transparent;
      border-right-color: var(--fill-color);
      border-bottom-color: var(--fill-color);
    }
    90% {
      border-color: transparent;
      border-bottom-color: var(--fill-color);
    }
  }
</style>

      <script>
        async function quickchart(key) {
          const quickchartButtonEl =
            document.querySelector('#' + key + ' button');
          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.
          quickchartButtonEl.classList.add('colab-df-spinner');
          try {
            const charts = await google.colab.kernel.invokeFunction(
                'suggestCharts', [key], {});
          } catch (error) {
            console.error('Error during call to suggestCharts:', error);
          }
          quickchartButtonEl.classList.remove('colab-df-spinner');
          quickchartButtonEl.classList.add('colab-df-quickchart-complete');
        }
        (() => {
          let quickchartButtonEl =
            document.querySelector('#df-214258f7-d48c-405c-bb11-d0f467b805e6 button');
          quickchartButtonEl.style.display =
            google.colab.kernel.accessAllowed ? 'block' : 'none';
        })();
      </script>
    </div>

  <div id="id_0b2be048-2812-45b6-a7e9-c279221213ea">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('sales_reset_df')"
            title="Generate code using this dataframe."
            style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
       width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"/>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_0b2be048-2812-45b6-a7e9-c279221213ea button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('sales_reset_df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<h2><span id="toc23">まとめ: Pandas MultiIndex を使いこなしてデータ分析を効率化</span></h2>
<p>この 記事 では、pandas の階層型インデックス（pandas MultiIndex）の基本的な使い方から、データの絞り込み、インデックスレベルを活かした集計方法までを、実際のデータとコードで具体的に学びました。</p>
<p><strong>pandas MultiIndex を効果的に使うことで、複数のカテゴリを持つ複雑なデータも整理しやすくなり、特定の条件でのデータ抽出や、各階層ごとの集計が効率的に行えるようになります。</strong> 例えば、「特定の月と店舗の売上を知りたい」「月ごとの売上合計を把握したい」といった具体的な分析ニーズに対し、pandas MultiIndex は強力な解決策を提供します。これにより、より深いデータ分析が可能になります。</p>
<p><strong>学んだこと:</strong></p>
<p>&#8211; <code>set_index()</code> による pandas MultiIndex の作成</p>
<p>&#8211; pandas MultiIndex を持つ DataFrame から、<code>[]</code> や <code>.loc</code> を使った列の選択</p>
<p>&#8211; 位置による行の絞り込み（<code>.iloc</code>についても触れました）</p>
<p>&#8211; <code>.loc</code> を使ったインデックスラベルによる行の絞り込み（単一・複数レベル、<code>slice(None)</code>の活用）</p>
<p>&#8211; <code>.loc</code> 使用時の <code>PerformanceWarning</code> の原因と、<code>sort_index()</code> によるパフォーマンス改善策</p>
<p>&#8211; <code>groupby(level=...)</code> を使った様々な pandas MultiIndex レベルでの集計（店舗別、月別、月・店舗別）</p>
<p>&#8211; <code>drop()</code> を使ったインデックス要素の削除</p>
<p>&#8211; <code>reset_index()</code> を使って pandas MultiIndex を通常の列に戻す方法</p>
<p>ぜひ、あなたのデータでも pandas MultiIndex を活用して、データ分析を効率化してみてください。この Notebook で紹介した様々なテクニックが、日々のデータ操作や分析の強力な味方となるはずです。</p>
<h3><span id="toc24">次のステップ</span></h3>
<ul>
<li>今回使用したサンプルデータを変更して、色々な絞り込みや集計を試してみましょう。</li>
<li>あなたの持っている実際のデータに pandas MultiIndex を適用して、どのように分析が効率化されるか体験してみましょう。</li>
<li><code>groupby()</code> の他の集計関数（<code>.mean()</code>, <code>.count()</code>, <code>.max()</code>, <code>.min()</code>など）を使って、様々な観点からデータを分析してみましょう。</li>
</ul>


</body>
</html>



<!-- ▼▼▼ 関連記事ボックス 共通スタイル（集計・変形）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc25">関連記事</span></h3> <ul> 
<ul>
  <li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ データ抽出・前処理：loc, iloc, isin, dropの使い方</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ MatplotlibでPandasデータを可視化する方法</a></li> </ul> </div>
<!-- ▼▼▼ 関連記事ボックス 共通スタイル（集計・変形）終了▼▼▼ -->



<!-- ▼▼▼ Pandasシリーズナビ（開始） ▼▼▼ -->
<p><style>
  /* ここだけに効く最小リセット */
  .pdl-series-nav p { margin: 0; line-height: 1.7; white-space: normal; }
  .pdl-series-nav a {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    white-space: normal !important;
  }
  /* 念のため画像リンク等のブロック化も無効化 */
  .pdl-series-nav a img { display: inline !important; }
</style></p>
<div id="pandas-series-nav" class="pdl-series-nav" style="clear: both; overflow: auto; position: relative; width: 100%; max-width: 100%; box-sizing: border-box; border: 2px solid #4db6ac; background: #eafaf8; padding: 14px 18px; border-radius: 10px; margin: 1.5em 0; box-shadow: 0 3px 6px rgba(0,0,0,0.05); transition: box-shadow .3s ease;">
<p style="margin: 0 0 6px 0; font-weight: 600; color: #00695c; font-size: 1.05em;">💡 Pandas DataFrame入門シリーズ</p>
<p>このページは「<a style="color: #00796b; text-decoration: underline; font-weight: 500;" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>」シリーズの一部です。データの作成から結合・集計までを体系的に学べます。</p>
</div>
<!-- ▲▲▲ Pandasシリーズナビ（終了） ▲▲▲ -->


<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1760196168623" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">MultiIndexとは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>pandasの階層型インデックス機能で、行や列に複数の階層を持たせることができます。</p>

</div>
</div>
<div id="faq-question-1760196192601" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">MultiIndexを作成する方法は？</span></h3>
<div class="rank-math-answer ">

<p><code>pd.MultiIndex.from_tuples()</code> や <code>set_index()</code> で階層を定義できます。</p>

</div>
</div>
<div id="faq-question-1760196206939" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">stack/unstackの役割は？</span></h3>
<div class="rank-math-answer ">

<p>行と列の階層を入れ替える操作で、MultiIndexを利用した集計に便利です。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-multiindex/">pandas MultiIndex完全ガイド｜階層型インデックスの作成・選択・集計方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-multiindex/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas groupby・aggの使い方｜複数列・複数集計と結果の見方</title>
		<link>https://pythondatalab.com/pandas-groupby-agg/</link>
					<comments>https://pythondatalab.com/pandas-groupby-agg/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 06:30:17 +0000</pubDate>
				<category><![CDATA[集計・変形]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=925</guid>

					<description><![CDATA[<p>pandasのgroupby()とagg()の使い方を初心者向けに解説。複数列・複数集計、辞書指定、名前付き集約、count()とsize()の違い、欠損値への対処、集計結果の見方まで、実行例を使って紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方｜複数列・複数集計と結果の見方</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
.colab-article pre[class*="language-"] {
  margin: 0 !important;
  padding: 1em;
}
.colab-article .code-toolbar {
  margin: 0 !important;
}
.colab-article .colab-output {
  overflow-x: auto;
  margin: 0 0 1em;
  padding: 0.75em 1em;
  background: #f6f8fa;
  color: #24292f;
  border: 1px solid #d0d7de;
  white-space: pre;
}
.colab-article table.wp-block-table {
  border: 1px solid #b8c2cc !important;
}
.colab-article table.wp-block-table th,
.colab-article table.wp-block-table td {
  border: 1px solid #b8c2cc !important;
}
.colab-article table.wp-block-table th {
  background: #f3f6f9;
  font-weight: 700;
}
.colab-article .colab-figure {
  margin: 1.5em 0;
  text-align: center;
}
.colab-article .colab-figure img {
  max-width: 100%;
  height: auto;
}
.colab-article .colab-figure figcaption {
  margin-top: 0.5em;
  color: #555;
  font-size: 0.9em;
}
</style>
<div class="colab-article">



<p>店舗別や商品別に売上をまとめようとして、<code>sum()</code> と <code>agg()</code> のどちらを使えばよいか迷ったことはありませんか。コードは動いても、集計後の列名が2段になったり、明細数が予想より少なかったりすると、結果をどう読めばよいか不安になります。</p>


<p>先に結論を示します。<strong>1種類の集計だけなら <code>sum()</code> や <code>mean()</code>、同じ列に複数の集計をするなら <code>agg([...])</code>、列ごとに異なる集計をするなら <code>agg({列名: 集計方法})</code>、結果の列名まで整えたいなら名前付き集約</strong>を選びます。</p>


<p>この記事では、同じ売上明細を使って書き方を段階的に変えます。出力の行・列・値を読み、欠損値や表記ゆれによる想定外の結果を確認し、最後は並べ替えや可視化へ使える表に整えます。<code>groupby()</code> は、データ型・欠損・表記を整えた後に比較用の集計表を作る処理です。</p>


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：集計の目的で書き方を選ぶ</a></li><li><a href="#toc3" tabindex="0">サンプルデータを用意する</a></li><li><a href="#toc4" tabindex="0">1種類だけ集計するならsum()などの専用メソッド</a></li><li><a href="#toc5" tabindex="0">同じ列へ複数の集計をするならagg()のリスト指定</a></li><li><a href="#toc6" tabindex="0">列ごとに異なる集計をするならagg()の辞書指定</a></li><li><a href="#toc7" tabindex="0">名前付き集約で分かりやすい1段の列にする</a><ol><li><a href="#toc8" tabindex="0">as_index=TrueとFalseの違い</a></li></ol></li><li><a href="#toc9" tabindex="0">count()とsize()は欠損値の扱いが違う</a></li><li><a href="#toc10" tabindex="0">コードは動くが結果を誤解しやすい場面</a><ol><li><a href="#toc11" tabindex="0">欠損したグループキーが結果から消える</a></li><li><a href="#toc12" tabindex="0">文字列数値で集計結果やエラーが想定と違う</a></li><li><a href="#toc13" tabindex="0">表記ゆれで同じ店舗が別グループになる</a></li></ol></li><li><a href="#toc14" tabindex="0">groupby().agg()と近い手法の選び方</a></li><li><a href="#toc15" tabindex="0">集計結果を次の分析へつなげる</a></li><li><a href="#toc16" tabindex="0">自分のデータへ置き換える前のチェックリスト</a></li><li><a href="#toc17" tabindex="0">まとめ</a></li><li><a href="#toc18" tabindex="0">関連記事</a><ol><li><a href="#toc19" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc20" tabindex="0">groupby().agg()とDataFrame.agg()の違いは何ですか？</a></li><li><a href="#toc21" tabindex="0">agg()とaggregate()は同じですか？</a></li><li><a href="#toc22" tabindex="0">複数列に別々の集計関数を使うにはどうしますか？</a></li><li><a href="#toc23" tabindex="0">集計後の列名が二段になるのはなぜですか？</a></li><li><a href="#toc24" tabindex="0">グループキーを通常の列にするにはどうしますか？</a></li><li><a href="#toc25" tabindex="0">count()とsize()で件数が違うのはなぜですか？</a></li><li><a href="#toc26" tabindex="0">NaNのグループが結果から消れるのはなぜですか？</a></li><li><a href="#toc27" tabindex="0">同じカテゴリが別グループになるのはなぜですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>


<ul>
<li><code>groupby()</code> と <code>agg()</code> の役割</li>
<li>専用メソッド・リスト・辞書・名前付き集約の選び方</li>
<li>集計結果のグループキー、列名、値の読み方</li>
<li><code>count()</code> と <code>size()</code>、<code>as_index=True</code> と <code>False</code> の違い</li>
<li>欠損値、データ型、表記ゆれで結果が変わる原因と修正方法</li>
<li>元データとの検算から並べ替え・可視化へ進む方法</li>
</ul>


<p>集計前にデータの構造を確認したい場合は、<a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>と<a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a>を参考にしてください。数値型の修正は<a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>、カテゴリの確認は<a href="https://pythondatalab.com/pandas-unique-nunique/">pandas unique()とnunique()の使い方</a>で解説しています。</p>

<h2><span id="toc2">先に結論：集計の目的で書き方を選ぶ</span></h2>


<p><code>groupby()</code> は同じ値を持つ行をグループに分け、<code>agg()</code> は各グループに集計関数を適用します。<code>agg()</code> は <code>aggregate()</code> の短い別名で、どちらも同じ処理です。通常は短い <code>agg()</code> がよく使われます。</p>


<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">求めたい結果</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">推奨する書き方</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">出力の特徴</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">注意点</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上合計など1種類</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>groupby(...)[列].sum()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1つの集計結果</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">単純な目的なら最も読みやすい</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">同じ列の合計・平均など</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>.agg(["sum", "mean"])</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">関数名が列になる</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">複数列では列名が2段になる</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">列ごとに異なる集計</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>.agg({"売上": "sum", ...})</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">元列と関数の組み合わせ</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">複数関数では2段列になりやすい</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">列名まで指定した集計</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>.agg(売上合計=("売上", "sum"))</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1段の分かりやすい列</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">可視化・結合へ渡しやすい</td>
</tr>
</tbody>
</table>

</div>
<p>単純な値別件数は <code>value_counts()</code>、2つのカテゴリの件数・割合は <code>crosstab()</code>、行と列を指定して再配置しながら集計するなら <code>pivot_table()</code> が向いています。選択を誤ると、欲しい数値は得られても、結果の形が次の作業に合わなくなります。</p>

<h2><span id="toc3">サンプルデータを用意する</span></h2>


<p>店舗ごとの売上を集計します。違いを確認できるように、売上が欠損している行と、店舗名が欠損している行を1つずつ含めます。</p>

<pre class="line-numbers"><code class="language-python">import pandas as pd
from IPython.display import display

df = pd.DataFrame({
    &quot;店舗&quot;: [&quot;東京&quot;, &quot;東京&quot;, &quot;大阪&quot;, &quot;大阪&quot;, &quot;名古屋&quot;, &quot;名古屋&quot;, &quot;名古屋&quot;, None],
    &quot;商品&quot;: [&quot;A&quot;, &quot;B&quot;, &quot;A&quot;, &quot;B&quot;, &quot;A&quot;, &quot;B&quot;, &quot;B&quot;, &quot;A&quot;],
    &quot;売上&quot;: [1200, 800, 1500, None, 700, 900, 600, 500],
    &quot;数量&quot;: [2, 1, 3, 2, 1, 2, 1, 1]
})

display(df)</code></pre>
<div id="df-bc24492a-9f64-478d-baa8-487a3d874782" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">数量</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">800.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">700.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">900.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">600.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">None</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
  </tbody>
</table>
</div></div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-bc24492a-9f64-478d-baa8-487a3d874782')" title="Convert this dataframe to an interactive table." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-bc24492a-9f64-478d-baa8-487a3d874782 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-bc24492a-9f64-478d-baa8-487a3d874782');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


  <div id="id_01b397e5-253b-428c-baad-7e045a21d625">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('df')" title="Generate code using this dataframe." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_01b397e5-253b-428c-baad-7e045a21d625 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('df');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<p>実行前の明細は8行です。インデックス3の売上は <code>NaN</code>、インデックス7の店舗も欠損しています。<code>NaN</code> は「0円」ではなく、値が入っていないことを表します。</p>


<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">インデックス</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">数量</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">700</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">B</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">600</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">A</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
</tr>
</tbody>
</table>

</div>
<p>自分のデータへ置き換えるときは、まず列名、データ型、欠損数、カテゴリの表記を確認してください。</p>

<pre class="line-numbers"><code class="language-python">print(df.dtypes)
print(&quot;\n欠損数&quot;)
display(df.isna().sum())
print(&quot;店舗の値:&quot;, df[&quot;店舗&quot;].unique())</code></pre>
<pre class="colab-output">店舗     object
商品     object
売上    float64
数量      int64
dtype: object

欠損数</pre>
<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">数量</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
    </tr>
  </tbody>
</table>
</div></div>
<br>
<label><b>dtype:</b> int64</label>
<pre class="colab-output">店舗の値: [&#x27;東京&#x27; &#x27;大阪&#x27; &#x27;名古屋&#x27; None]</pre>
<p><code>売上</code> は欠損値を含むため <code>float64</code> になります。店舗と売上に各1件の欠損があることも確認できます。ここを見ずに集計すると、行数や合計が予想と違う原因を見落とします。</p>


<p>型の確認は<a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a>、文字列数値の修正は<a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>、カテゴリ確認は<a href="https://pythondatalab.com/pandas-unique-nunique/">pandas unique()とnunique()の使い方</a>を参考にしてください。</p>

<h2><span id="toc4">1種類だけ集計するならsum()などの専用メソッド</span></h2>


<p>まず、店舗別の売上合計だけを求めます。集計が1種類なら、<code>agg()</code> を使わず <code>sum()</code> と書く方が目的を読み取りやすくなります。<code>sort=False</code> は、サンプルに最初に現れた店舗順を保つために指定しています。</p>

<pre class="line-numbers"><code class="language-python">sales_sum = (
    df.groupby(&quot;店舗&quot;, sort=False)[&quot;売上&quot;]
      .sum()
)
display(sales_sum)</code></pre>
<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
    </tr>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
    </tr>
  </tbody>
</table>
</div></div>
<br>
<label><b>dtype:</b> float64</label>
<p><strong>行インデックスがグループキーの店舗、値が店舗内の売上合計</strong>です。東京は <code>1200 + 800 = 2000</code>、大阪は欠損値を除いた <code>1500</code>、名古屋は <code>700 + 900 + 600 = 2200</code> です。</p>


<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗（インデックス）</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
</tr>
</tbody>
</table>

</div>
<p>店舗が欠損した500円の行は、標準の <code>groupby()</code> ではグループに含まれません。この点は後半で確認します。</p>

<h2><span id="toc5">同じ列へ複数の集計をするならagg()のリスト指定</span></h2>


<p>売上について、合計・平均・有効な値の件数を同時に確認します。集計関数名を文字列のリストで渡します。</p>

<pre class="line-numbers"><code class="language-python">sales_stats = (
    df.groupby(&quot;店舗&quot;, sort=False)[&quot;売上&quot;]
      .agg([&quot;sum&quot;, &quot;mean&quot;, &quot;count&quot;])
)
display(sales_stats.round(1))</code></pre>
<div id="df-bc95ccbc-3037-4f63-a80e-f56249bd393e" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">sum</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">mean</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">count</th>
    </tr>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">733.3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
  </tbody>
</table>
</div></div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-bc95ccbc-3037-4f63-a80e-f56249bd393e')" title="Convert this dataframe to an interactive table." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-bc95ccbc-3037-4f63-a80e-f56249bd393e button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-bc95ccbc-3037-4f63-a80e-f56249bd393e');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    </div>
  </div>

<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">sum</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">mean</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">count</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">733.3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
</tr>
</tbody>
</table>

</div>
<p><code>sum</code> は合計、<code>mean</code> は欠損値を除いた平均、<code>count</code> は売上に値が入っている件数です。大阪には明細が2行ありますが、売上が有効なのは1行なので <code>count</code> は1です。<strong>明細行数を知りたい場合に <code>count()</code> を選ぶと、コードは動いても件数を誤解します。</strong></p>

<h2><span id="toc6">列ごとに異なる集計をするならagg()の辞書指定</span></h2>


<p>売上には合計と平均、数量には合計と最大値を使います。対象列ごとに処理が違う場合は、<code>列名: 集計方法</code> の辞書で指定します。</p>

<pre class="line-numbers"><code class="language-python">stats_by_column = (
    df.groupby(&quot;店舗&quot;, sort=False)
      .agg({
          &quot;売上&quot;: [&quot;sum&quot;, &quot;mean&quot;],
          &quot;数量&quot;: [&quot;sum&quot;, &quot;max&quot;]
      })
)
display(stats_by_column.round(1))</code></pre>
<div id="df-6bc6f1d1-4bc6-4a26-8845-be27060c460b" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead tr th {
        text-align: left;
    }

    .dataframe thead tr:last-of-type th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th colspan="2" halign="left" style="white-space: nowrap; padding: 0.2em 0.4em;">数量</th>
    </tr>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">sum</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">mean</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">sum</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">max</th>
    </tr>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">733.3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
  </tbody>
</table>
</div></div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-6bc6f1d1-4bc6-4a26-8845-be27060c460b')" title="Convert this dataframe to an interactive table." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-6bc6f1d1-4bc6-4a26-8845-be27060c460b button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-6bc6f1d1-4bc6-4a26-8845-be27060c460b');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


    </div>
  </div>

<p>この出力では列が2段になります。上段の <code>売上</code>・<code>数量</code> が元の列、下段の <code>sum</code>・<code>mean</code>・<code>max</code> が適用した関数です。たとえば名古屋の <code>(売上, mean)</code> は733.3、<code>(数量, max)</code> は2です。</p>


<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上 sum</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上 mean</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">数量 sum</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">数量 max</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">733.3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
</tbody>
</table>

</div>
<p>二段列は情報を正確に表しますが、列名を指定する可視化や結合では扱いにくいことがあります。その場合は、次の名前付き集約を選びます。</p>

<h2><span id="toc7">名前付き集約で分かりやすい1段の列にする</span></h2>


<p>名前付き集約では、<code>出力列名=(元の列名, 集計方法)</code> と指定します。<code>as_index=False</code> も使い、店舗をインデックスではなく通常の列として残します。次の可視化・並べ替え・結合へ渡しやすい形です。</p>

<pre class="line-numbers"><code class="language-python">summary = (
    df.groupby(&quot;店舗&quot;, as_index=False, sort=False)
      .agg(
          売上合計=(&quot;売上&quot;, &quot;sum&quot;),
          平均売上=(&quot;売上&quot;, &quot;mean&quot;),
          有効売上件数=(&quot;売上&quot;, &quot;count&quot;),
          明細行数=(&quot;売上&quot;, &quot;size&quot;),
          商品種類数=(&quot;商品&quot;, &quot;nunique&quot;)
      )
)
summary[&quot;平均売上&quot;] = summary[&quot;平均売上&quot;].round(1)
display(summary)</code></pre>
<div id="df-75532261-5958-43a1-8e34-afee7547e183" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上合計</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">平均売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">有効売上件数</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">明細行数</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品種類数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">733.3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
  </tbody>
</table>
</div></div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-75532261-5958-43a1-8e34-afee7547e183')" title="Convert this dataframe to an interactive table." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-75532261-5958-43a1-8e34-afee7547e183 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-75532261-5958-43a1-8e34-afee7547e183');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


  <div id="id_23a3258c-afbd-44cd-b142-30f7df36fb58">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('summary')" title="Generate code using this dataframe." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_23a3258c-afbd-44cd-b142-30f7df36fb58 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('summary');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上合計</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">平均売上</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">有効売上件数</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">明細行数</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品種類数</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">733.3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
</tbody>
</table>

</div>
<p>処理前は店舗ごとの明細が複数行ありましたが、処理後は1店舗1行になりました。大阪では <code>有効売上件数=1</code>、<code>明細行数=2</code> なので、2件の明細のうち売上が欠損した行が1件あると判断できます。</p>


<h3><span id="toc8">as_index=TrueとFalseの違い</span></h3>


<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">設定</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">グループキーの位置</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">標準の <code>as_index=True</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">インデックス</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">集計結果をそのまま参照するとき</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>as_index=False</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">通常の列</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">可視化・結合・CSV保存へ使うとき</td>
</tr>
</tbody>
</table>

</div>
<p>標準設定で集計した後に通常の列へ戻すなら、<code>reset_index()</code> も使えます。</p>


<p>インデックスを通常の列へ戻す方法は、<a href="https://pythondatalab.com/pandas-reset-index/">pandas reset_index()の使い方</a>で詳しく解説しています。</p>

<h2><span id="toc9">count()とsize()は欠損値の扱いが違う</span></h2>


<p><code>count()</code> は指定列の欠損値を数えず、<code>size()</code> はグループ内の行そのものを数えます。大阪のように売上が欠損した行があると差が生まれます。</p>

<pre class="line-numbers"><code class="language-python">count_size = (
    df.groupby(&quot;店舗&quot;, sort=False)
      .agg(
          売上の有効値数=(&quot;売上&quot;, &quot;count&quot;),
          明細行数=(&quot;売上&quot;, &quot;size&quot;)
      )
)
display(count_size)</code></pre>
<div id="df-3aa8217d-6e09-4adb-947e-e655b79e6c4e" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上の有効値数</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">明細行数</th>
    </tr>
    <tr>
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
    </tr>
  </tbody>
</table>
</div></div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-3aa8217d-6e09-4adb-947e-e655b79e6c4e')" title="Convert this dataframe to an interactive table." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-3aa8217d-6e09-4adb-947e-e655b79e6c4e button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-3aa8217d-6e09-4adb-947e-e655b79e6c4e');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


  <div id="id_7830ccf2-84b3-4ff0-97b1-7317ff4ab869">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('count_size')" title="Generate code using this dataframe." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_7830ccf2-84b3-4ff0-97b1-7317ff4ab869 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('count_size');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上の有効値数（count）</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">明細行数（size）</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
</tr>
</tbody>
</table>

</div>
<p><strong>売上が記録された件数</strong>なら <code>count()</code>、<strong>欠損を含む明細の行数</strong>なら <code>size()</code> を選びます。差が想定外なら、売上列の欠損数を確認してください。</p>

<h2><span id="toc10">コードは動くが結果を誤解しやすい場面</span></h2>


<h3><span id="toc11">欠損したグループキーが結果から消える</span></h3>


<p><strong>現象：</strong> 元データの売上合計は6200なのに、店舗別売上の合計は5700になります。<br>
<strong>原因：</strong> <code>groupby()</code> は標準で、グループキーが欠損した行を結果に含めません。<br>
<strong>確認方法：</strong> 元合計、店舗が欠損していない行の合計、集計後合計を比べます。</p>

<pre class="line-numbers"><code class="language-python">source_total = df[&quot;売上&quot;].sum()
eligible_total = df.loc[df[&quot;店舗&quot;].notna(), &quot;売上&quot;].sum()
grouped_total = summary[&quot;売上合計&quot;].sum()

print(&quot;元データ全体の売上合計:&quot;, source_total)
print(&quot;店舗名がある行の売上合計:&quot;, eligible_total)
print(&quot;店舗別集計後の売上合計:&quot;, grouped_total)</code></pre>
<pre class="colab-output">元データ全体の売上合計: 6200.0
店舗名がある行の売上合計: 5700.0
店舗別集計後の売上合計: 5700.0</pre>
<p>出力は順に <code>6200.0</code>、<code>5700.0</code>、<code>5700.0</code> です。集計計算が間違ったのではなく、店舗が欠損した500円が標準設定の対象外です。</p>


<p><strong>修正方法：</strong> 欠損した店舗も確認対象なら <code>dropna=False</code> を指定します。修正後は欠損店舗の500円が別グループとして現れ、集計後合計が6200になります。欠損店舗を業務上の「不明」として補完するか、除外するかは分析目的に応じて決めてください。</p>

<pre class="line-numbers"><code class="language-python">summary_with_missing = (
    df.groupby(&quot;店舗&quot;, dropna=False, as_index=False, sort=False)
      .agg(売上合計=(&quot;売上&quot;, &quot;sum&quot;))
)
display(summary_with_missing)
print(&quot;集計後合計:&quot;, summary_with_missing[&quot;売上合計&quot;].sum())</code></pre>
<div id="df-3dfada0b-8a92-4219-951d-0381194467cb" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上合計</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500.0</td>
    </tr>
  </tbody>
</table>
</div></div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-3dfada0b-8a92-4219-951d-0381194467cb')" title="Convert this dataframe to an interactive table." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-3dfada0b-8a92-4219-951d-0381194467cb button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-3dfada0b-8a92-4219-951d-0381194467cb');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


  <div id="id_8d14e0e6-ef37-41a7-820b-2d5a54cf24c2">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('summary_with_missing')" title="Generate code using this dataframe." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_8d14e0e6-ef37-41a7-820b-2d5a54cf24c2 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('summary_with_missing');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<pre class="colab-output">集計後合計: 6200.0</pre>
<h3><span id="toc12">文字列数値で集計結果やエラーが想定と違う</span></h3>


<p><strong>現象：</strong> 数値のつもりの列が文字列で、集計できない、または期待しない結果になります。<br>
<strong>原因：</strong> CSVやExcelから読み込んだ列に、カンマや通貨記号などが混ざっている可能性があります。<br>
<strong>確認方法：</strong> <code>df.dtypes</code> または <code>df.info()</code> で集計対象列の型を確認します。<br>
<strong>修正方法：</strong> 不要な記号を除いたうえで <code>pd.to_numeric(..., errors="coerce")</code> を使い、変換できなかった行が新しい欠損値になっていないか確認します。意味のある文字列を無条件に欠損へ変えてはいけません。</p>


<h3><span id="toc13">表記ゆれで同じ店舗が別グループになる</span></h3>


<p><strong>現象：</strong> 「東京」と「東京 」が別の行に集計されます。<br>
<strong>原因：</strong> 末尾の空白など、見た目で気づきにくい文字の違いがあります。<br>
<strong>確認方法：</strong> <code>unique()</code> でグループキーの値を確認します。<br>
<strong>修正方法：</strong> 意味を確認してから <code>str.strip()</code> や <code>replace()</code> で表記をそろえ、再度 <code>unique()</code> と集計結果のグループ数を確認します。</p>


<p>前後の空白を除く方法は<a href="https://pythondatalab.com/pandas-str-strip/">pandas str.strip()の使い方</a>、値の表記を置き換える方法は<a href="https://pythondatalab.com/pandas-replace/">pandas replace()の使い方</a>を参考にしてください。</p>

<h2><span id="toc14">groupby().agg()と近い手法の選び方</span></h2>


<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">手法</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">何を求めるか</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">選択を誤った場合</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>groupby().agg()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">グループ別の複数集計</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">店舗別に売上合計・平均・件数をまとめる</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">単純件数には記述が長くなる</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>DataFrame.agg()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">DataFrame全体の列・行方向の集約</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">グループ分けせず列ごとの統計量を出す</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">店舗別などの区分は得られない</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>value_counts()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1列の値別件数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">商品A・Bが何件あるか数える</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">売上合計など複数指標には向かない</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>crosstab()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">2カテゴリの組み合わせの件数・割合</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">店舗×商品の件数表を作る</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">数値列の柔軟な複数集計には向かない</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>pivot_table()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">行・列へ配置した集計表</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">店舗を行、商品を列にして売上を比較する</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">単純な縦長集計には形が複雑になる</td>
</tr>
</tbody>
</table>

</div>
<p><code>apply()</code> や <code>transform()</code> はより自由なグループ処理に使えますが、単純な集計を行うこの記事では深入りしません。まずは目的が明確で読みやすい専用メソッドや <code>agg()</code> を選びましょう。</p>


<p>単純な件数確認は<a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方</a>、2列のクロス集計は<a href="https://pythondatalab.com/pandas-crosstab/">pandas crosstab()の使い方</a>、表の再配置を伴う集計は<a href="https://pythondatalab.com/pandas-pivot/">Pandas pivotとpivot_tableの違い</a>、日時単位の集計は<a href="https://pythondatalab.com/pandas-resample/">pandas resample()の使い方</a>を参考にしてください。</p>

<h2><span id="toc15">集計結果を次の分析へつなげる</span></h2>


<p>名前付き集約で作った <code>summary</code> は、店舗が通常の列で、集計列も1段です。そのまま売上合計順に並べ替えられます。</p>

<pre class="line-numbers"><code class="language-python">summary_sorted = summary.sort_values(&quot;売上合計&quot;, ascending=False)
display(summary_sorted)</code></pre>
<div id="df-a7af0090-59dc-4fa5-935a-2aaabf455bd4" class="colab-df-container">
    <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上合計</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">平均売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">有効売上件数</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">明細行数</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品種類数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">名古屋</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2200.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">733.3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
  </tbody>
</table>
</div></div>
    <div class="colab-df-buttons">

  <div class="colab-df-container">
    <button class="colab-df-convert" onclick="convertToInteractive('df-a7af0090-59dc-4fa5-935a-2aaabf455bd4')" title="Convert this dataframe to an interactive table." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
    <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
  </svg>
    </button>

  <style>
    .colab-df-container {
      display:flex;
      gap: 12px;
    }

    .colab-df-convert {
      background-color: #E8F0FE;
      border: none;
      border-radius: 50%;
      cursor: pointer;
      display: none;
      fill: #1967D2;
      height: 32px;
      padding: 0 0 0 0;
      width: 32px;
    }

    .colab-df-convert:hover {
      background-color: #E2EBFA;
      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
      fill: #174EA6;
    }

    .colab-df-buttons div {
      margin-bottom: 4px;
    }

    [theme=dark] .colab-df-convert {
      background-color: #3B4455;
      fill: #D2E3FC;
    }

    [theme=dark] .colab-df-convert:hover {
      background-color: #434B5C;
      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
      fill: #FFFFFF;
    }
  </style>

    <script>
      const buttonEl =
        document.querySelector('#df-a7af0090-59dc-4fa5-935a-2aaabf455bd4 button.colab-df-convert');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      async function convertToInteractive(key) {
        const element = document.querySelector('#df-a7af0090-59dc-4fa5-935a-2aaabf455bd4');
        const dataTable =
          await google.colab.kernel.invokeFunction('convertToInteractive',
                                                    [key], {});
        if (!dataTable) return;

        const docLinkHtml = 'Like what you see? Visit the ' +
          '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
          + ' to learn more about interactive tables.';
        element.innerHTML = '';
        dataTable['output_type'] = 'display_data';
        await google.colab.output.renderOutput(dataTable, element);
        const docLink = document.createElement('div');
        docLink.innerHTML = docLinkHtml;
        element.appendChild(docLink);
      }
    </script>
  </div>


  <div id="id_deeb35a2-40d1-4148-a1db-7f8e3e891311">
    <style>
      .colab-df-generate {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-generate:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      [theme=dark] .colab-df-generate {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-generate:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>
    <button class="colab-df-generate" onclick="generateWithVariable('summary_sorted')" title="Generate code using this dataframe." style="display:none;">

  <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
    <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
  </svg>
    </button>
    <script>
      (() => {
      const buttonEl =
        document.querySelector('#id_deeb35a2-40d1-4148-a1db-7f8e3e891311 button.colab-df-generate');
      buttonEl.style.display =
        google.colab.kernel.accessAllowed ? 'block' : 'none';

      buttonEl.onclick = () => {
        google.colab.notebook.generateWithVariable('summary_sorted');
      }
      })();
    </script>
  </div>

    </div>
  </div>

<p>売上合計は名古屋2200、東京2000、大阪1500の順です。次は棒グラフにすると、店舗間の差を視覚的に比較できます。ここでは集計が主題なので、グラフ作成は最小限の例にとどめます。</p>

<pre class="line-numbers"><code class="language-python">!pip install japanize-matplotlib &gt; /dev/null # Google Colab の機能を使って日本語フォントをインストール・インポート
import japanize_matplotlib

import matplotlib.pyplot as plt

ax = summary_sorted.plot.bar(
    x=&quot;店舗&quot;,
    y=&quot;売上合計&quot;,
    legend=False,
    color=&quot;steelblue&quot;,
    figsize=(7, 4)
)
ax.set_title(&quot;店舗別の売上合計&quot;)
ax.set_xlabel(&quot;店舗&quot;)
ax.set_ylabel(&quot;売上合計&quot;)
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()</code></pre>
<figure class="colab-figure">
  <img decoding="async" src="data:image/png;base64,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
" alt="店舗別の売上合計を比較する棒グラフ">
  <figcaption>店舗別の売上合計を多い順に比較した棒グラフ</figcaption>
</figure>
<blockquote>
  <p>Google Colabで日本語が四角形になる場合は、日本語フォントの設定が必要です。グラフの作り方は<a href="https://pythondatalab.com/matplotlib-bar-barh-stacked/">Matplotlib棒グラフ入門</a>で確認してください。横持ちの比較表へ変える場合は<a href="https://pythondatalab.com/pandas-pivot/">Pandas pivotとpivot_tableの違い</a>、順位付けは<a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門</a>へ進むと自然です。</p>
</blockquote>

<h2><span id="toc16">自分のデータへ置き換える前のチェックリスト</span></h2>


<ul>
<li>グループキーと集計対象の列名は正しいか</li>
<li>列名の前後に空白がないか</li>
<li>売上・数量などが数値型になっているか</li>
<li>グループキーと集計対象列に欠損値が何件あるか</li>
<li>カテゴリに全角・半角、前後空白などの表記ゆれがないか</li>
<li>元データの1行が明細、顧客、日など何を表すか</li>
<li><code>sum</code>・<code>mean</code>・<code>count</code>・<code>size</code> が知りたい指標と合っているか</li>
<li>出力を可視化・結合するなら、列名とインデックスの形が使いやすいか</li>
<li>集計対象をそろえたうえで、元データと集計後の合計が一致するか</li>
</ul>

<h2><span id="toc17">まとめ</span></h2>


<ul>
<li>1種類の集計だけなら <code>sum()</code> や <code>mean()</code> などの専用メソッドを選ぶ</li>
<li>同じ列に複数関数ならリスト、列ごとに異なる関数なら辞書を <code>agg()</code> へ渡す</li>
<li>次の分析へ使いやすい列名が必要なら名前付き集約を選ぶ</li>
<li><code>as_index=False</code> または <code>reset_index()</code> でグループキーを通常列にできる</li>
<li><code>count()</code> は有効値、<code>size()</code> は欠損を含む行数を数える</li>
<li>欠損キー、データ型、表記ゆれを確認し、同じ対象範囲で元合計と照合する</li>
</ul>


<p><code>groupby().agg()</code> のゴールは、コードを動かすことではありません。集計目的に合う書き方を選び、結果を説明できる状態にして、並べ替え・ピボット・可視化へ進めることです。</p>

<h2><span id="toc18">関連記事</span></h2>


<p>今回の集計前後で役立つ関連記事をまとめます。</p>


<ul>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方と基本操作を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方｜Non-Null Count・データ型・欠損値の見方</a></li>
<li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-unique-nunique/">pandas unique()とnunique()の使い方｜値の一覧・種類数・value_counts()との違い</a></li>
<li><a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方</a></li>
<li><a href="https://pythondatalab.com/pandas-crosstab/">pandas crosstab()の使い方｜2つの列をクロス集計・割合表示する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-pivot/">Pandas pivotとpivot_tableの違い｜重複データ対応と集計方法</a></li>
<li><a href="https://pythondatalab.com/pandas-reset-index/">pandas reset_index()の使い方｜インデックスを振り直す方法</a></li>
<li><a href="https://pythondatalab.com/pandas-sort/">pandas 並び替え（sort）入門｜sort_values・sort_indexの違い</a></li>
<li><a href="https://pythondatalab.com/matplotlib-bar-barh-stacked/">Matplotlib 棒グラフ入門｜横棒・グループ化・積み上げまで解説</a></li>
</ul>

<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc19"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>

</div>
<script>
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', function () { Prism.highlightAll(); });
} else {
  Prism.highlightAll();
}
</script>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1788360480945" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc20">groupby().agg()とDataFrame.agg()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>groupby().agg()</code> は店舗別などのグループごとに集計します。<code>DataFrame.agg()</code> はグループ分けをせず、DataFrameの列または行へ集計関数を適用します。</p>

</div>
</div>
<div id="faq-question-1788360492087" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">agg()とaggregate()は同じですか？</span></h3>
<div class="rank-math-answer ">

<p>はい。<code>agg()</code> は <code>aggregate()</code> の別名です。通常は短い <code>agg()</code> がよく使われます</p>

</div>
</div>
<div id="faq-question-1788360504649" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">複数列に別々の集計関数を使うにはどうしますか？</span></h3>
<div class="rank-math-answer ">

<p><code>agg({"売上": "sum", "数量": "mean"})</code> のように辞書で指定します。出力列名も決めたい場合は、<code>売上合計=("売上", "sum")</code> のような名前付き集約が便利です。</p>

</div>
</div>
<div id="faq-question-1788360521766" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">集計後の列名が二段になるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>複数列へ複数関数を適用すると、元の列名と集計関数名を両方表すため列がMultiIndexになります。次工程で1段列が必要なら、名前付き集約を使います。</p>

</div>
</div>
<div id="faq-question-1788360528031" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">グループキーを通常の列にするにはどうしますか？</span></h3>
<div class="rank-math-answer ">

<p><code>groupby(..., as_index=False)</code> を使うか、集計後に <code>reset_index()</code> を実行します。</p>

</div>
</div>
<div id="faq-question-1788360539279" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">count()とsize()で件数が違うのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>count()</code> は対象列の欠損値を数えず、<code>size()</code> はグループの行数を数えるためです。有効な売上件数には <code>count()</code>、欠損を含む明細数には <code>size()</code> を選びます。</p>

</div>
</div>
<div id="faq-question-1788360549561" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">NaNのグループが結果から消れるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>groupby()</code> は標準でグループキーが欠損した行を除くためです。欠損キーも表示して確認するなら <code>dropna=False</code> を指定します。</p>

</div>
</div>
<div id="faq-question-1788360560600" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">同じカテゴリが別グループになるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>前後空白、全角・半角、大文字・小文字などの表記が異なる可能性があります。<code>unique()</code> で実際の値を確認し、意味を確かめてから <code>str.strip()</code> や <code>replace()</code> でそろえます。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方｜複数列・複数集計と結果の見方</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-groupby-agg/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
