<?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>Python Data Lab（Pythonデータラボ）</title>
	<atom:link href="https://pythondatalab.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://pythondatalab.com</link>
	<description>Python初心者向けに、わかりやすいデータ分析の解説を提供します。</description>
	<lastBuildDate>Tue, 25 Aug 2026 01:13:55 +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>Python Data Lab（Pythonデータラボ）</title>
	<link>https://pythondatalab.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>
<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>
<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>

<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 str.strip()の使い方｜文字列・列名の前後空白を削除する方法</title>
		<link>https://pythondatalab.com/pandas-str-strip/</link>
					<comments>https://pythondatalab.com/pandas-str-strip/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Tue, 18 Aug 2026 13:25:56 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2114</guid>

					<description><![CDATA[<p>pandasのstr.strip()で文字列の前後にある半角・全角スペースを削除する方法を初心者向けに解説。str.lstrip()・str.rstrip()との違い、列名の空白除去、NaNや混在列の注意点もサンプルコードで確認します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-str-strip/">pandas str.strip()の使い方｜文字列・列名の前後空白を削除する方法</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;overflow:auto}
.colab-article .wp-block-table-wrap{overflow-x:auto;margin:0.75em 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;white-space:nowrap;padding:0.2em 0.4em;text-align:left}
.colab-article table.wp-block-table th:first-child,.colab-article table.wp-block-table td:first-child{min-width:3em}
.colab-article pre.colab-output{margin:0.75em 0;padding:0.8em;overflow:auto;background:#f6f7f7;color:#1e1e1e;white-space:pre-wrap}
.colab-article figure.colab-figure{margin:1em 0}.colab-article figure.colab-figure img{max-width:100%;height:auto}
</style>
<div class="colab-article">


<p><code>東京</code>を指定したのに一部の行が出てこない。同じ地域が別々に集計される。正しい列名なのに<code>KeyError</code>になる——原因は、CSVやExcelに紛れ込んだ見えない空白かもしれません。pandasでは、文字列が入った列に<code>str.strip()</code>を使うと前後の空白を削除できます。</p>

<pre class="line-numbers"><code class="language-python">df["地域"] = df["地域"].str.strip()
</code></pre>

<p>左側だけなら<code>str.lstrip()</code>、右側だけなら<code>str.rstrip()</code>、列名の前後空白なら<code>df.columns.str.strip()</code>を使います。この記事では、空白を見つけるところから、削除後に抽出・集計が正しくできることを確認するところまで、Google Colabで試せる例で解説します。</p>
<h2><span id="toc1">この記事でわかること</span></h2>

<ul>
<li><code>df["列名"].str.strip()</code>で値の前後空白を削除する方法</li>
<li><code>str.strip()</code>・<code>str.lstrip()</code>・<code>str.rstrip()</code>の違い</li>
<li><code>df.columns.str.strip()</code>で列名の空白を削除する方法</li>
<li>半角スペース・全角スペース・タブ・改行・<code>NaN</code>の注意点</li>
<li><code>str.strip()</code>・<code>str.replace()</code>・<code>replace()</code>・<code>rename()</code>の使い分け</li>
<li><code>unique()</code>や<code>value_counts()</code>で修正前後を確認する方法</li>
</ul>

<blockquote>
  <p><strong>先に判断基準</strong>：値の両端なら<code>str.strip()</code>、左端だけなら<code>str.lstrip()</code>、右端だけなら<code>str.rstrip()</code>、列名の両端なら<code>df.columns.str.strip()</code>です。文字列の途中にある空白や、別の値への置換は目的が異なります。</p>
</blockquote>
<h2><span id="toc2">Pandas DataFrame入門シリーズでの位置づけ</span></h2>

<p>空白の除去は、データを読み込んで内容を確認したあと、抽出・集計・結合へ進む前に行う前処理です。</p>

<p><strong>CSV・Excel読込 → 値と型の確認 → 前後空白の除去 → 表記ゆれの修正 → 抽出・集計・結合</strong></p>

<p>Google ColabへのCSV読込は<a href="https://pythondatalab.com/google-colab-csv/">こちらの記事</a>、Excelの読込は<a href="https://pythondatalab.com/pandas-read-excel/">read_excel()の記事</a>で詳しく解説しています。</p>
<h2><span id="toc3">見えない空白が抽出・集計を狂わせる</span></h2>

<p>次の売上データには、地域名の前後に半角スペースや全角スペースが混ざっています。表では違いが分かるよう、半角スペースを<code>␠</code>、全角スペースを<code>□</code>として示します。実際のDataFrameでは、これらは見えにくい文字です。</p>

<div class="wp-block-table-wrap">
<table class="wp-block-table">
<thead>
<tr>
  <th style="text-align:right;">行</th>
  <th>実際の値</th>
  <th>見える表記</th>
  <th style="text-align:right;">売上</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="text-align:right;">0</td>
  <td><code>東京</code></td>
  <td>東京</td>
  <td style="text-align:right;">1200</td>
</tr>
<tr>
  <td style="text-align:right;">1</td>
  <td><code>東京</code></td>
  <td>␠東京</td>
  <td style="text-align:right;">1800</td>
</tr>
<tr>
  <td style="text-align:right;">2</td>
  <td><code>東京</code></td>
  <td>東京␠</td>
  <td style="text-align:right;">1500</td>
</tr>
<tr>
  <td style="text-align:right;">3</td>
  <td><code>　東京　</code></td>
  <td>□東京□</td>
  <td style="text-align:right;">900</td>
</tr>
<tr>
  <td style="text-align:right;">4</td>
  <td><code>大阪</code></td>
  <td>大阪</td>
  <td style="text-align:right;">1100</td>
</tr>
<tr>
  <td style="text-align:right;">5</td>
  <td><code>NaN</code></td>
  <td>欠損値</td>
  <td style="text-align:right;">700</td>
</tr>
</tbody>
</table>
</div>

<p>まずは追加ファイル不要のサンプルデータを作り、空白を除去する前の状態を確認します。<code>repr()</code>を使うと、半角スペースは引用符の内側に見え、全角スペースも位置を確認しやすくなります。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd
import numpy as np

df = pd.DataFrame({
    "地域": ["東京", " 東京", "東京 ", "　東京　", "大阪", np.nan],
    "商品": ["商品A", "商品B", "商品C", "商品D", "商品E", "商品F"],
    "売上": [1200, 1800, 1500, 900, 1100, 700]
})

print("repr()で確認:")
print(df["地域"].map(repr).to_list())

print("\n空白除去前の件数:")
print(df["地域"].value_counts(dropna=False))

print("\n'東京'と完全一致する行:")
display(df[df["地域"] == "東京"] )</code></pre>
<pre class="colab-output">repr()で確認:
["'東京'", "' 東京'", "'東京 '", "'\\u3000東京\\u3000'", "'大阪'", 'nan']

空白除去前の件数:</pre>
<div class="wp-block-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;"></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;">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;">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;">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;">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;">1</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;">1</td></tr></tbody>
</table>
</div>
<pre class="colab-output">'東京'と完全一致する行:</pre>
<div class="wp-block-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;"></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></tr></tbody>
</table>
</div>
<p><code>東京</code>、<code>東京</code>、<code>東京</code>、<code>　東京　</code>は、pandasでは別の文字列です。そのため、空白除去前の<code>value_counts()</code>では別々に数えられ、<code>== "東京"</code>では空白のない1行しか抽出されません。</p>

<p>値の種類を詳しく調べる方法は<a href="https://pythondatalab.com/pandas-unique-nunique/">unique()・nunique()の記事</a>、件数の確認方法は<a href="https://pythondatalab.com/pandas-value-counts/">value_counts()の記事</a>も参考にしてください。</p>

<h2><span id="toc4">str.strip()で文字列の前後空白を削除する</span></h2>

<p>pandasでは、DataFrameの1列分を**Series（シリーズ）**と呼びます。列に入っている文字列をまとめて処理するため、<code>.str</code>を付けて<code>df["地域"].str.strip()</code>と書きます。</p>

<p><code>str.strip()</code>は、前後の半角スペース・全角スペース・タブ・改行などを取り除きます。文字列の途中にある空白は残ります。画面では見えない特殊な文字が残る場合もあるため、実データでは処理前後を確認しましょう。</p>
<pre class="line-numbers"><code class="language-python"># 処理前の値を残し、比較できるようにする
df["地域_処理前"] = df["地域"]

# 結果を代入して、地域列を更新する
df["地域"] = df["地域"].str.strip()

comparison = df[["地域_処理前", "地域"]].copy()
comparison["処理前_repr"] = comparison["地域_処理前"].map(repr)
comparison["処理後_repr"] = comparison["地域"].map(repr)
display(comparison[["処理前_repr", "処理後_repr"]])

print("空白除去後の件数:")
print(df["地域"].value_counts(dropna=False))

print("\n空白除去後に'東京'と一致する行:")
display(df[df["地域"] == "東京"][["地域", "商品", "売上"]])</code></pre>
<div class="wp-block-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;"></th><th style="white-space: nowrap; padding: 0.2em 0.4em;">処理前_repr</th><th style="white-space: nowrap; padding: 0.2em 0.4em;">処理後_repr</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;">&#8216;東京&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;東京&#8217;</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;">&#8216; 東京&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;東京&#8217;</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;">&#8216;東京 &#8216;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;東京&#8217;</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;">&#8216;\u3000東京\u3000&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;東京&#8217;</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;">&#8216;大阪&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;大阪&#8217;</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;">nan</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">nan</td></tr></tbody>
</table>
</div>
<pre class="colab-output">空白除去後の件数:</pre>
<div class="wp-block-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;"></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;">4</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;">nan</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td></tr></tbody>
</table>
</div>
<pre class="colab-output">空白除去後に'東京'と一致する行:</pre>
<div class="wp-block-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;"></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></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;">1800</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;">商品C</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">1500</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;">商品D</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td></tr></tbody>
</table>
</div>
<p>処理後は、空白違いで分かれていた4つの値がすべて<code>東京</code>になります。その結果、<code>value_counts()</code>では<code>東京</code>が4件にまとまり、条件抽出でも4行を取得できます。空白除去によって別々だったカテゴリが統合されるため、集計件数が変わるのは正常です。</p>

<div class="wp-block-table-wrap">
<table class="wp-block-table">
<thead>
<tr>
  <th>処理前</th>
  <th>処理後</th>
</tr>
</thead>
<tbody>
<tr>
  <td><code>東京</code></td>
  <td><code>東京</code></td>
</tr>
<tr>
  <td><code>␠東京</code></td>
  <td><code>東京</code></td>
</tr>
<tr>
  <td><code>東京␠</code></td>
  <td><code>東京</code></td>
</tr>
<tr>
  <td><code>□東京□</code></td>
  <td><code>東京</code></td>
</tr>
<tr>
  <td><code>大阪</code></td>
  <td><code>大阪</code></td>
</tr>
<tr>
  <td><code>NaN</code></td>
  <td><code>NaN</code></td>
</tr>
</tbody>
</table>
</div>

<p><code>NaN</code>は空文字列ではなく欠損値です。<code>str.strip()</code>を使っても欠損値のまま保たれます。欠損値を埋めたい場合は、空白除去とは分けて<a href="https://pythondatalab.com/pandas-fillna/">fillna()</a>を検討します。</p>

<blockquote>
  <p><strong>重要</strong>：<code>df["地域"].str.strip()</code>を実行しただけでは、元の列は変わりません。更新するには<code>df["地域"] = ...</code>のように結果を代入します。</p>
</blockquote>

<h2><span id="toc5">str.strip()・str.lstrip()・str.rstrip()の違い</span></h2>

<p>同じ文字列を使うと、どちら側の空白が削除されるかを比較できます。</p>

<div class="wp-block-table-wrap">
<table class="wp-block-table">
<thead>
<tr>
  <th>目的</th>
  <th>pandasでの書き方</th>
  <th>結果のイメージ</th>
</tr>
</thead>
<tbody>
<tr>
  <td>前後を削除</td>
  <td><code>s.str.strip()</code></td>
  <td><code>␠東京␠</code> → <code>東京</code></td>
</tr>
<tr>
  <td>左側だけ削除</td>
  <td><code>s.str.lstrip()</code></td>
  <td><code>␠東京␠</code> → <code>東京␠</code></td>
</tr>
<tr>
  <td>右側だけ削除</td>
  <td><code>s.str.rstrip()</code></td>
  <td><code>␠東京␠</code> → <code>␠東京</code></td>
</tr>
</tbody>
</table>
</div>
<pre class="line-numbers"><code class="language-python">s = pd.Series([" 東京 ", "　大阪　", "商品 A", "\t名古屋\n"])

result = pd.DataFrame({
    "元の値": s.map(repr),
    "strip": s.str.strip().map(repr),
    "lstrip": s.str.lstrip().map(repr),
    "rstrip": s.str.rstrip().map(repr)
})
display(result)</code></pre>
<div class="wp-block-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;"></th><th style="white-space: nowrap; padding: 0.2em 0.4em;">元の値</th><th style="white-space: nowrap; padding: 0.2em 0.4em;">strip</th><th style="white-space: nowrap; padding: 0.2em 0.4em;">lstrip</th><th style="white-space: nowrap; padding: 0.2em 0.4em;">rstrip</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;">&#8216; 東京 &#8216;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;東京&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;東京 &#8216;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216; 東京&#8217;</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;">&#8216;\u3000大阪\u3000&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;大阪&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;大阪\u3000&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;\u3000大阪&#8217;</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;">&#8216;商品 A&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;商品 A&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;商品 A&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;商品 A&#8217;</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;">&#8216;\t名古屋\n&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;名古屋&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;名古屋\n&#8217;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;\t名古屋&#8217;</td></tr></tbody>
</table>
</div>
<h3><span id="toc6">strip(chars)は指定した語句を丸ごと削除する機能ではない</span></h3>

<p><code>strip("abc")</code>は、<code>abc</code>という並びを探して削除する機能ではありません。文字列の両端から、<code>a</code>・<code>b</code>・<code>c</code>のどれかに当たる文字を1文字ずつ取り除きます。それ以外の文字に当たると処理が止まり、文字列の途中にある文字は削除されません。</p>

<p>次の例では、両端にある<code>H</code>・<code>e</code>・<code>l</code>・<code>o</code>・<code>!</code>は削除されますが、途中の<code>Python</code>に含まれる<code>o</code>は残ります。</p>
<pre class="line-numbers"><code class="language-python">sample = pd.Series(["Helloooo! Python!"])
print(sample.str.strip("Helo!").iloc[0])
# 結果は ' Python'。途中にあるPythonのoは削除されない</code></pre>
<pre class="colab-output"> Python</pre>
<h3><span id="toc7">補足：文字以外の値が混ざる列に注意する</span></h3>

<p>1つの列に文字列と数値が混ざっている場合は注意が必要です。<code>.str.strip()</code>を使うと、数値や<code>True</code>・<code>False</code>は欠損値になります。元からある<code>NaN</code>も欠損値のままです。実行前に、対象列へ文字列だけが入っているか確認しましょう。</p>
<pre class="line-numbers"><code class="language-python">mixed = pd.Series([" 東京 ", 100, True, np.nan], dtype="object")
mixed_result = pd.DataFrame({
    "処理前": mixed.map(repr),
    "処理後": mixed.str.strip().map(repr)
})
display(mixed_result)</code></pre>
<div class="wp-block-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;"></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;">&#8216; 東京 &#8216;</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">&#8216;東京&#8217;</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;">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;">2</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">True</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;">nan</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">nan</td></tr></tbody>
</table>
</div>
<p><code>商品 A</code>のような<strong>文字列途中の空白は、どのstrip系メソッドでも残ります</strong>。途中の空白を削除・置換したい場合は<code>str.replace()</code>の役割です。</p>

<p>空白除去では引数を省略する使い方を基本にすると安全です。</p>

<h2><span id="toc8">列名の前後空白はdf.columns.str.strip()で削除する</span></h2>

<p>CSVやExcelの見出しに空白が入っていると、<code>df["売上"]</code>と指定しても、実際の列名が<code>" 売上"</code>なら<code>KeyError</code>になります。列の<strong>値</strong>ではなく<strong>列名</strong>を整える場合は、<code>df.columns</code>に対して<code>str.strip()</code>を使います。</p>

<div class="wp-block-table-wrap">
<table class="wp-block-table">
<thead>
<tr>
  <th>変更前の列名</th>
  <th>変更後の列名</th>
</tr>
</thead>
<tbody>
<tr>
  <td><code>商品名</code></td>
  <td><code>商品名</code></td>
</tr>
<tr>
  <td><code>␠売上</code></td>
  <td><code>売上</code></td>
</tr>
<tr>
  <td><code>地域␠</code></td>
  <td><code>地域</code></td>
</tr>
</tbody>
</table>
</div>
<pre class="line-numbers"><code class="language-python">df_columns = pd.DataFrame(
    [["商品A", 1200, "東京"], ["商品B", 1100, "大阪"]],
    columns=["商品名", " 売上", "地域 "],
)

print("変更前:", [repr(col) for col in df_columns.columns])
df_columns.columns = df_columns.columns.str.strip()
print("変更後:", [repr(col) for col in df_columns.columns])

# 空白除去後は、空白なしの列名で選択できる
display(df_columns[["商品名", "売上", "地域"]])</code></pre>
<pre class="colab-output">変更前: ["'商品名'", "' 売上'", "'地域 '"]
変更後: ["'商品名'", "'売上'", "'地域'"]</pre>
<div class="wp-block-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;"></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;">商品A</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</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;">商品B</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td></tr></tbody>
</table>
</div>
<p><code>df.columns.str.strip()</code>は列名の前後空白を取る処理です。<code>売上金額</code>を<code>売上</code>へ変えるように、列名そのものを別名へ変更したい場合は<a href="https://pythondatalab.com/pandas-rename/">rename()の記事</a>を参照してください。</p>

<h2><span id="toc9">strip・replace・renameは目的で使い分ける</span></h2>

<p>空白や表記ゆれを直す方法は似て見えますが、処理する場所と目的が違います。</p>

<div class="wp-block-table-wrap">
<table class="wp-block-table">
<thead>
<tr>
  <th>目的</th>
  <th>使う方法</th>
  <th>主な対象</th>
  <th>例</th>
</tr>
</thead>
<tbody>
<tr>
  <td>値の前後空白を削除</td>
  <td><code>s.str.strip()</code></td>
  <td>1列の各文字列</td>
  <td><code>␠東京␠</code> → <code>東京</code></td>
</tr>
<tr>
  <td>値の左端だけ削除</td>
  <td><code>s.str.lstrip()</code></td>
  <td>1列の各文字列</td>
  <td><code>␠東京␠</code> → <code>東京␠</code></td>
</tr>
<tr>
  <td>値の右端だけ削除</td>
  <td><code>s.str.rstrip()</code></td>
  <td>1列の各文字列</td>
  <td><code>␠東京␠</code> → <code>␠東京</code></td>
</tr>
<tr>
  <td>文字列の一部を置換</td>
  <td><code>s.str.replace()</code></td>
  <td>各文字列の一部分</td>
  <td><code>商品 A</code> → <code>商品A</code></td>
</tr>
<tr>
  <td>値全体を別の値へ置換</td>
  <td><code>s.replace()</code></td>
  <td>SeriesまたはDataFrameの値</td>
  <td><code>東京都</code> → <code>東京</code></td>
</tr>
<tr>
  <td>列名の前後空白を削除</td>
  <td><code>df.columns.str.strip()</code></td>
  <td>列名</td>
  <td><code>␠売上</code> → <code>売上</code></td>
</tr>
<tr>
  <td>列名を別名へ変更</td>
  <td><code>df.rename()</code></td>
  <td>列名・行ラベル</td>
  <td><code>売上金額</code> → <code>売上</code></td>
</tr>
</tbody>
</table>
</div>

<p>Pythonの単一文字列<code>text</code>なら<code>text.strip()</code>、pandasの列<code>df["地域"]</code>なら<code>df["地域"].str.strip()</code>です。値全体の置換や辞書を使った表記統一は<a href="https://pythondatalab.com/pandas-replace/">pandas replace()の記事</a>で詳しく扱っています。</p>

<h2><span id="toc10">よくあるミスと注意点</span></h2>

<h3><span id="toc11">1. 結果を代入せず、元の列も変わったと思う</span></h3>

<p><code>str.strip()</code>は、空白を削除した新しい結果を返します。元の列は自動では変わらないため、<code>df["地域"] = ...</code>のように対象列へ戻します。</p>

<h3><span id="toc12">2. 文字列の途中にある空白まで消えると思う</span></h3>

<p><code>strip()</code>が対象にするのは両端です。<code>商品 A</code>の中央の空白を変えたい場合は<code>str.replace()</code>などを検討します。ただし、氏名や住所など、途中の空白に意味があるデータもあるため、一律に消してよいか確認が必要です。</p>

<h3><span id="toc13">3. NaNと空文字列を同じものとして扱う</span></h3>

<p><code>NaN</code>は欠損値、<code>""</code>は長さ0の文字列、<code>"   "</code>は空白だけの文字列です。空白だけの文字列は<code>strip()</code>後に<code>""</code>になりますが、自動で<code>NaN</code>にはなりません。</p>

<h3><span id="toc14">4. 混在列を安易にastype(str)へ変換する</span></h3>

<p>数値や欠損値が混ざる列を<code>astype(str)</code>にすると、欠損値まで文字列の<code>"nan"</code>になる場合があります。まず<code>dtypes</code>で型を確認し、必要な列だけ処理しましょう。型変換は<a href="https://pythondatalab.com/pandas-astype/">astype()の記事</a>で詳しく解説しています。</p>

<h3><span id="toc15">5. 全角スペースを見落とす</span></h3>

<p>日本語データには全角スペースが混ざることがあります。引数なしの<code>str.strip()</code>では一般的な全角スペースも両端から除去できますが、<code>repr()</code>、<code>unique()</code>、<code>value_counts()</code>で処理前後を確認する習慣が大切です。</p>
<h2><span id="toc16">前処理の流れでstr.strip()を使うタイミング</span></h2>

<p>実際の分析では、次の順番にすると空白による見落としを減らせます。</p>

<ol>
<li>CSVやExcelを読み込む</li>
<li><code>head()</code>・<code>dtypes</code>・<code>unique()</code>・<code>value_counts()</code>で列と値を確認する</li>
<li>文字列値は<code>Series.str.strip()</code>、列名は<code>df.columns.str.strip()</code>で前後空白を除去する</li>
<li><code>unique()</code>や<code>value_counts()</code>を再実行し、カテゴリが正しく統合されたか確認する</li>
<li>必要なら<code>replace()</code>で他の表記ゆれを統一する</li>
<li>条件抽出、<code>groupby()</code>、<code>merge()</code>、可視化へ進む</li>
</ol>

<p>空白除去後の部分一致抽出は<a href="https://pythondatalab.com/pandas-str-contains/">str.contains()の記事</a>、集計は<a href="https://pythondatalab.com/pandas-groupby-agg/">groupby×aggの記事</a>、DataFrameの結合は<a href="https://pythondatalab.com/pandas-merge/">mergeの記事</a>へ進むと、分析の流れをつなげて学べます。</p>

<p>複数の文字列列をまとめて処理する方法や、正規表現による連続空白の統一、Unicode正規化、大規模データでの速度最適化もあります。ただし、最初は問題のある列を特定し、1列ずつ安全に確認する方法で十分です。</p>

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

<ul>
<li>pandasで文字列の前後空白を削除する基本は<code>Series.str.strip()</code></li>
<li>左側だけなら<code>str.lstrip()</code>、右側だけなら<code>str.rstrip()</code></li>
<li>列名の前後空白は<code>df.columns.str.strip()</code>で削除する</li>
<li><code>strip()</code>は文字列途中の空白を削除しない</li>
<li><code>NaN</code>、空文字列、空白だけの文字列は別の値として考える</li>
<li>処理結果を代入し、<code>unique()</code>や<code>value_counts()</code>で修正後を確認する</li>
<li>空白除去は、データ読込・確認のあと、抽出・集計・結合の前に行う</li>
</ul>

<p>まずは、見た目が同じ値が別々に集計されていないかを確認してみましょう。前後空白が原因なら、対象の文字列列に<code>str.strip()</code>を使うことで、その後の抽出や集計を正しく進めやすくなります。</p>

<h2><span id="toc18">次に読みたい関連記事</span></h2>

<ul>
<li><a href="https://pythondatalab.com/pandas-unique-nunique/">pandas unique()とnunique()の使い方</a>：値の一覧と表記ゆれを確認する</li>
<li><a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方</a>：修正前後の件数を比較する</li>
<li><a href="https://pythondatalab.com/pandas-replace/">pandas replace()の使い方</a>：値全体の置換や表記統一を行う</li>
<li><a href="https://pythondatalab.com/pandas-rename/">pandas rename()の使い方</a>：列名を別名へ変更する</li>
<li><a href="https://pythondatalab.com/pandas-str-contains/">pandas str.contains()の使い方</a>：文字列を含む行を抽出する</li>
<li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>：CSVを読み込んで確認する</li>
<li><a href="https://pythondatalab.com/pandas-read-excel/">pandas read_excel()の使い方</a>：Excelファイルを読み込む</li>
<li><a href="https://pythondatalab.com/pandas-astype/">pandas astype()の使い方</a>：object型・string型などの型変換を確認する</li>
<li><a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas groupby×aggの使い方</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 id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1787058889722" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc20">str.strip()は半角スペースと全角スペースの両方を削除できますか？</span></h3>
<div class="rank-math-answer ">

<p>引数を省略した<code>str.strip()</code>は、文字列の前後にある一般的な半角スペース・全角スペース・タブ・改行などを削除します。ただし、画面では見えない特殊な文字が残る場合もあるため、<code>repr()</code>や<code>unique()</code>で結果を確認してください。</p>

</div>
</div>
<div id="faq-question-1787058902973" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">str.strip()とstr.replace()はどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p>前後の空白を取り除くなら<code>str.strip()</code>、文字列の途中を含む特定文字を置換するなら<code>str.replace()</code>です。値全体を別の値へ置換する<code>Series.replace()</code>・<code>DataFrame.replace()</code>とも目的が異なります。</p>

</div>
</div>
<div id="faq-question-1787058916244" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">文字列の途中にある空白も削除できますか？</span></h3>
<div class="rank-math-answer ">

<p><code>str.strip()</code>では削除できません。途中の空白には<code>str.replace()</code>などを使えますが、氏名や住所の空白まで消してよいかを先に確認しましょう。</p>

</div>
</div>
<div id="faq-question-1787058931569" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">列名の前後空白をまとめて削除できますか？</span></h3>
<div class="rank-math-answer ">

<p>はい。<code>df.columns = df.columns.str.strip()</code>で列名の前後空白をまとめて削除できます。列名を別の名前へ変更する場合は<code>rename()</code>を使います。</p>

</div>
</div>
<div id="faq-question-1787058946335" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">str.strip()を使ったのに元のDataFrameが変わらないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>str.strip()</code>は処理後の新しいSeriesを返すためです。<code>df["地域"] = df["地域"].str.strip()</code>のように対象列へ代入してください。</p>

</div>
</div>
<div id="faq-question-1787058959992" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">空白を削除したら別々だったカテゴリは同じ値として集計されますか？</span></h3>
<div class="rank-math-answer ">

<p>はい。<code>東京</code>、<code>東京</code>、<code>東京</code>がすべて<code>東京</code>になれば、<code>value_counts()</code>や<code>groupby()</code>では同じカテゴリとして集計されます。削除後に件数が意図どおりか必ず確認してください。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-str-strip/">pandas str.strip()の使い方｜文字列・列名の前後空白を削除する方法</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-str-strip/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas corr()の使い方｜相関係数・相関行列を初心者向けに解説</title>
		<link>https://pythondatalab.com/pandas-corr/</link>
					<comments>https://pythondatalab.com/pandas-corr/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 09 Aug 2026 09:11:45 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2107</guid>

					<description><![CDATA[<p>pandasのcorr()を使って相関係数・相関行列を求める方法を初心者向けに解説。正負の相関の読み方、Pearson・Spearman・Kendallの違い、欠損値やNaNへの対処、ヒートマップ・散布図で確認する流れまでコード例付きで紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-corr/">pandas corr()の使い方｜相関係数・相関行列を初心者向けに解説</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 .table-scroll { overflow-x: auto; margin: 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 #c7c7c7;
    white-space: nowrap;
    padding: 0.5em 0.75em;
    text-align: left;
  }
  .colab-article table.wp-block-table thead th {
    background-color: #f2f2f2;
    font-weight: 700;
  }
  .colab-article table.wp-block-table th:first-child,
  .colab-article table.wp-block-table td:first-child { min-width: 3em; }
</style>
<div class="colab-article">

<p><code>describe()</code>で平均値や標準偏差を確認したあとに、<strong>「売上と広告費には関係があるの？」「どの列とどの列が一緒に動いているの？」</strong>と気になることはありませんか？</p>
<p>そんなときに使えるのが、Pandasの<code>corr()</code>です。<code>corr()</code>を使うと、複数の数値列の関係を<strong>相関係数</strong>としてまとめた「相関行列」を作れます。</p>
<p>ただし、<code>df.corr()</code>を実行して表を出すだけでは十分ではありません。大切なのは、<strong>相関係数の符号と大きさを読み、気になる組み合わせを散布図でも確認すること</strong>です。</p>
<p>この記事では、Google Colabでそのまま試せる小さなDataFrameを使って、<code>corr()</code>の基本から相関行列の読み方、散布図との使い分けまで順番に解説します。</p>
<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
<li><code>corr()</code>を何のために使うのか</li>
<li>相関係数の「1・0・-1」の意味</li>
<li>DataFrameから相関行列を作り、どこを見ればよいか</li>
<li>Pearson・Spearman・Kendallの基本的な違い</li>
<li><code>corr()</code>と<code>describe()</code>・散布図の使い分け</li>
<li>文字列型や欠損値があるときの注意点</li>
<li>相関係数だけで判断せず、散布図へ進む分析の流れ</li>
</ul>
<p>この記事のゴールは、<strong><code>corr()</code>で相関行列を作って正しく読み、気になる関係を散布図で確かめられるようになること</strong>です。</p>
<h2><span id="toc2">まず結論：corr()は「列と列の関係」をまとめて確認するときに使う</span></h2>
<p>データを確認するときは、知りたいことによって使う方法を変えると迷いにくくなります。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">知りたいこと</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">主に使う方法</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">見えるもの</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1列の値を要約したい</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>describe()</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">平均・標準偏差・四分位数など</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">複数の数値列の関係を一覧で見たい</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>corr()</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">相関係数・相関行列</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">2列の関係を目で確かめたい</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">散布図（<code>scatter</code>）</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">点の散らばり・外れ値・曲線的な関係</td>
</tr>
</tbody>
</table></div>
<p>つまり、<code>corr()</code>は<strong>1列ずつを見る<code>describe()</code>と、2列を図で見る散布図の間をつなぐ役割</strong>があります。</p>
<p>基本統計量の確認方法を先に知りたい方は、<a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方</a>も参考にしてください。DataFrameそのものがまだ不慣れな場合は、<a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>から確認すると流れをつかみやすくなります。</p>
<h2><span id="toc3">相関係数とは？-1〜1の値をどう読むか</span></h2>
<p>相関係数は、2つの数値がどの程度一緒に動くかを**-1から1の範囲**で表した値です。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">相関係数の状態</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">読み方</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">イメージ</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1に近い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">正の相関が強い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">一方が大きいほど、もう一方も大きい傾向</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0付近</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">直線的な相関が弱い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">一方が変わっても、もう一方の増減がはっきりしない</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-1に近い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">負の相関が強い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">一方が大きいほど、もう一方は小さい傾向</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1または-1</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">完全な正・負の相関</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">点が完全に一直線に並ぶ関係</td>
</tr>
</tbody>
</table></div>
<p>ここで重要なのは、<strong>符号は関係の向き、絶対値は直線的な関係の強さを見る手がかり</strong>だということです。たとえば<code>-0.9</code>は「マイナスだから弱い」のではなく、強い負の相関を示します。</p>
<p>また、「0.7以上なら必ず強い」のように数値だけで機械的に判断するのはおすすめできません。何を強いとみなすかは、データの種類や分析目的によって変わります。まずは相関係数で候補を見つけ、元データや散布図も確認するのが基本です。</p>
<h2><span id="toc4">相関を確認するサンプルDataFrameを作る</span></h2>
<p>ここからは、ある店舗の12期間分のデータを例にします。<code>広告費</code>、<code>売上</code>、<code>気温</code>、<code>返品件数</code>という4つの数値列を用意します。</p>
<p>今回は相関の違いを確認しやすいように、関係がはっきり表れる練習用データを使用します。</p>
<p>この例で知りたいのは、<strong>どの列同士が一緒に増減しているのか</strong>です。まずは元データを確認しましょう。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd

df = pd.DataFrame({
    "広告費": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65],
    "売上": [82, 95, 103, 119, 128, 142, 151, 165, 172, 188, 197, 211],
    "気温": [18, 25, 12, 28, 16, 22, 30, 14, 26, 19, 24, 20],
    "返品件数": [42, 39, 37, 35, 32, 31, 28, 26, 24, 21, 19, 17]
})

df</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">10</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">82</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">18</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">42</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">15</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">95</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">25</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">39</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">2</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">20</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">103</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">12</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">37</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">3</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">25</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">119</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">28</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">35</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">4</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">30</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">128</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">16</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">32</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">5</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">35</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">142</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">22</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">31</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">6</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">40</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">151</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">30</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">28</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">7</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">45</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">165</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">14</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">26</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">8</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">50</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">172</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">26</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">24</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">9</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">55</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">188</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">19</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">21</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">10</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">60</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">197</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">24</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">19</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">11</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">65</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">211</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">20</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">17</td>
</tr>
</tbody>
</table></div>
<p>元のDataFrameは、<strong>1行が1期間の観測データ</strong>です。この12行から、列同士の関係をまとめた表へ変換するのが次の<code>corr()</code>です。</p>
<h2><span id="toc5">pandas corr()の基本的な使い方</span></h2>
<p>DataFrameの相関係数をまとめて求める基本形は、次の1行です。</p>
<pre class="line-numbers"><code class="language-python">corr_matrix = df.corr()
corr_matrix.round(3)</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p>実行すると、元の12行×4列のデータから、次のような<strong>4列×4列の相関行列</strong>が得られます。小数第3位に丸めると、おおよそ次の値です。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p>これが「処理前→処理後」の大きな変化です。<code>corr()</code>は各行を個別に表示するのではなく、<strong>列と列の組み合わせごとに1つの相関係数を計算</strong>します。</p>
<h3><span id="toc6">相関行列は「対角線以外」を見る</span></h3>
<p>相関行列を初めて見ると、<code>1.000</code>がたくさん並んでいて戸惑うかもしれません。見るポイントは2つです。</p>
<ol>
<li><strong>対角線はすべて1になる</strong>
<ul>
<li><code>広告費</code>と<code>広告費</code>のように、同じ列を自分自身と比較しているためです。</li>
</ul></li>
<li><strong>上下には同じ組み合わせが重複する</strong>
<ul>
<li><code>広告費×売上</code>と<code>売上×広告費</code>は同じ関係なので、同じ値になります。</li>
</ul></li>
</ol>
<p>そのため、初心者のうちは<strong>対角線ではなく、異なる列同士の値を見る</strong>と考えれば十分です。</p>
<h3><span id="toc7">特定の列との相関だけを確認する</span></h3>
<p>相関行列全体ではなく、たとえば「売上とほかの列の関係だけを見たい」という場合は、列名を指定します。</p>
<pre class="line-numbers"><code class="language-python"># 「売上」とほかの列との相関だけを確認
corr_matrix["売上"].drop("売上")</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999175</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122452</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998055</td>
</tr>
</tbody>
</table></div>
<p><code>corr_matrix["売上"]</code>で売上の列だけを取り出し、<code>drop("売上")</code>で売上自身との相関係数<code>1.0</code>を除いています。特定の指標と関係が強い列を探したいときに便利です。</p>
<h3><span id="toc8">ヒートマップで相関行列を視覚的に捉える</span></h3>
<p>列数が多いDataFrameでは、相関行列を<strong>ヒートマップ</strong>にすると、相関の強さと向きを色で見分けやすくなります。ここでは、先ほど作った<code>corr_matrix</code>をそのまま可視化します。</p>
<p><code>seaborn</code>ライブラリの<code>heatmap</code>関数を使うと、簡単にヒートマップを作成できます。</p>
<pre class="line-numbers"><code class="language-python">!pip install japanize_matplotlib
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語フォントを有効にする

plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.3f', linewidths=.5)
plt.title('相関行列のヒートマップ')
plt.show()</code></pre>
<figure class="colab-figure">
  <img decoding="async" src="data:image/png;base64,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aN++fZHaVeBpSrGxscjMzMTDhw9x6NAhaGtrw8jICGZmZtDQ0EBaWhpKlixZpEYRERERkfIV6RFz1atXh52dHSwsLKChoYFHjx7B3t7+P/90ESIiIipeqvSIue9ZoQNBsViMgIAAjBo1CjExMYiOjkb79u0xbdo0mJqafv0ERERERFSsCh0ICgQCeHl5QUdHBzVr1oSrqyt++uknDB06VJHtIyIiIpIhFguUtqmTIi1lbmlpKXlg8l9//QUzMzNFtYuIiIiIlCxfgWBMTAyioqLk7gsNDcWhQ4dw/fp1dOjQAZaWlujZs6dCG0lERET0KXmP+aaCy1fX8KtXr+Dq6oqEhAQkJSVJjQH89ddf4e/vj1q1amH//v0YNWoUkpKSlNZgIiIiIk4WUYx8BYINGjTA69evMWnSJMyZM0fySJOcnBx07twZXbp0AQDUqVMHHh4emDNnjvJaTEREREQKke8xgiVLlsSECRPQrFkz7NixA3379oWmpqbM4tHTp0/Hmzd8LBIREREpj1jFFpT+XhV4soizszOcnZ3z3F+xYkVUrFixSI0iIiIiIuUr0qxhIiIiouLAySKKUaQnixARERGR6mJGkIiIiFSOus3uVRZmBImIiIjUFDOCREREpHKYEVQMBoJERESkckRq9kxgZWHXMBEREZGaYkaQiIiIVA67hhWDGUEiIiIiNcWMIBEREakcZgQVgxlBIiIiIjXFjCARERGpHD5iTjGYESQiIiJSU8wIEhERkcoRcx1BhWAgSERERCqHk0UUg13DRERERGqKGUEiIiJSOZwsohjMCBIRERGpKWYEiYiISOVwjKBiMCNIREREpKaYESQiIiKVw4ygYjAjSERERKSmmBEkIiIilcNZw4rBQJCIiIhUDruGFYNdw0RERERqihlBIiIiUjkiUXG34L+BGUEiIiIiNcWMIBEREakcjhFUDGYEiYiIiNQUM4JERESkcpgRVAxmBImIiIjUFDOCREREpHK4oLRiMBAkIiIilSNWat+wQInn/r6wa5iIiIhITTEjSERERCqHk0UUgxlBIiIiIjXFjCARERGpHD5iTjGYESQiIiJSskePHsHd3R0VKlSAra0t5s2b98UJL3v27IGenh6sra2ltmvXrknqJCYmYujQoahUqRLKlSuH/v37IykpqUDtYiBIREREKkcsVt6maHFxcXB1dYW7uztevnyJCxcuYPPmzfD398/zGKFQiE6dOkEoFEptDRo0kNTp3r07UlJS8PDhQ7x48QIZGRno3bt3gdrGQJCIiIhIiQIDA2FmZobRo0dDIBDAysoKs2fPhr+/P7KysuQeEx4ejvLly+d5zgsXLuDMmTNYunQp9PT0oKenhz/++APHjh3DvXv38t02BoJERESkckRi5W2KFhISAk9PT6kyDw8PREdH49atW3KPEQqFsLGx+eI5GzRoAHNzc0mZubk5GjZsiCNHjuS7bd/NZBFTx0bF3QT6hvh5qxePrNDibgJ9Q/XsTYq7CaQGlLl8TEZGBjIyMqTKdHV1oaurW6jzhYeHw9LSUuZ8JiYmCA8Pz/OYFy9eoG3btnjy5AksLS3h4+ODjh075nlOALC0tMzznPJ8N4Fgkw5nirsJ9I2cP9icn7caOX+wOW6GxRd3M+gbqWdvgiDtqsXdDPpG/qu/5Pn5+cHX11eqbMaMGZg5c6ZM3djYWNStWzfPc3l7e0NbWxsaGrKdsAKBIM8JI1paWkhISMDGjRthbm6OkydPomvXrti5cyfatWtXqHPKfZ981yQiIiL6ToiV+LDhyZMnw9vbW6osr2ygmZkZhELhF893/PhxRERESJWlp6cjISEBVlZWco85ceKE1Os2bdqgT58+WL9+Pdq1awdra2u53coRERGoX7/+F9vzKY4RJCIiIvqErq4ujIyMpLbCdgsDgJubGw4fPixVdvLkSZiYmKBevXpyjxHJWSgxJycHAoFAcs6rV68iPv5jj8vbt29x7do1tGvXLt9tYyBIREREKkeVJov069cPkZGRWLlyJQAgMjISPj4+GDt2LLS1tWXqZ2VlwcnJCQEBAZJZxceOHcPmzZsxaNAgAECdOnXQsmVL/Pbbb8jIyEB6ejpGjhyJli1bonbt2vluGwNBIiIiIiUqU6YMTpw4gZ07d8LS0hKNGjWCl5cXJk6cKKnTo0cP9OjRAwCgra2NLVu24Pz587C1tYWZmRkmTJiA9evXo1WrVpJjtm/fDg0NDVSqVAmVKlWClpYWtm3bVqC2cYwgERERqRxlzhpWhho1auDUqVN57t+5c6fUawcHB+zZs+eL5yxdujQ2bNhQpHYxI0hERESkppgRJCIiIpUjUuKsYXXCQJCIiIhUjqp1DX+v2DVMREREpKaYESQiIiKVw4ygYjAjSERERKSmmBEkIiIilSNiSlAhmBEkIiIiUlPMCBIREZHKEcs+ipcKgRlBIiIiIjXFjCARERGpHDHHCCoEA0EiIiJSOSJ2DSsEu4aJiIiI1BQzgkRERKRy2DWsGMwIEhEREakpZgSJiIhI5YiYEFQIZgSJiIiI1BQzgkRERKRyxEwJKgQzgkRERERqihlBIiIiUjmcNKwYzAgSERERqSlmBImIiEjliDhGUCEYCBIREZHK4YLSisGuYSIiIiI1xYwgERERqRyxqLhb8N/AjCARERGRmmJGkIiIiFSOiGMEFSLfGcH79+9j2bJlX6xz6tQpjBw5ssiNIiIiIiLly3dGMDw8HCtXroSOjg7s7e1hZ2eH8uXLS/YLhUL06dMHU6dOVUpDiYiIiD7grGHFKFDXsKamJl6/fo1Tp07h9u3bEIvF+PHHH9GkSROMGDEC3t7eGDZsmLLaSkREREQK9NVAUCwWQyAQAAAqV66MefPmSfZdu3YNnTt3xrx58+Ds7IzRo0crr6VERERE/+KC0orx1UCwbt26SEpKgpGREUQiEYKDgyEUChEcHIyXL19i5syZaNu2LQYOHIhWrVohKCgIhoaG36LtREREpKbYM6wYXw0Eb968iRcvXuD69es4d+4cBg0ahPDwcAwcOBC7du2CtbU1AODEiRP48ccf0adPH+zfv1/pDSciIiKiovnqrOHY2FgYGhqiZ8+eyMzMxOvXrzF9+nSYmppCQ0MDzZs3BwAIBAIsWbIE5cqVQ1pamtIbTkREROpLLBIrbVMnXw0EL1y4AEdHR0ybNg3Xr1/HkydPcOnSJfj5+cHS0hI3b96Et7c3wsLCMG3aNNSvXx8lS5b8Fm0nIiIioiL4aiDo4OCAw4cPo3r16nj//j3mzp2LX3/9FYmJiQCAsmXLok6dOujWrRuCg4PRv39/JTeZiIiI1J1ILFbapk6+OkZwzJgxEAgEEIvFCA8PR3BwMCIiIjBr1iy4uLhAV1cXffv2xcOHD7F27VqcP38eLVu2/BZtJyIiIqIi+GogGBwcjH379kEoFCIuLg5169ZF27Zt0aZNGxw/fhyrV6+Gu7s7Xrx4gaCgIAwbNgzXr1//Fm0nIiIiNaVuY/mU5atdw8HBwVixYgUsLS0hEAgQGBiIxYsXQygUwsvLCw4ODpg4cSKGDx+OBg0aQFdXF48fP/4WbSciIiKiIvhqRtDNzQ1ubm4AgKdPn0JbWxt+fn6IiIhA7dq10blzZ7Rs2VLSHfzXX3+hatWqym01ERERqTVmBBWjQI+Y8/HxAQC0adNGUjZ79mypOjVr1lRAs4iIiIjyxjhQMb7aNfy5J0+eSL3+sI4gEREREamWAgeCrVq1knodFhamsMYQERER5QcXlFaMAgeC4s/W1xEIBAprDBERERF9O18dI3j37l2p19nZ2bh37x7EYjHEYrHU6w9q1aql+JYSERER/evzxBQVzlcDwV9++UXqdUJCAgYOHCh5nZiYiF9++UXygQgEAly9elXBzfx+NXIyxqDetihdShupaTlY9c8LnL8Sn2f9erVK49d+FWFuqouMDBH2BEVg+36hZL+mpgD9etrArYUF9PQ0IYx4j+VrnuHxkxRJnXIWehgzuDKqVjGEAMC5K/FYue4Z3qeLlHmphOL5vMuU1sbgPhXhXK8MBAIB3iZmYvPuNwg5H6vUayXg5rUL2LX5byQlvUXJkvro+fNQOLk0y7N+Wloq7t68gjMng3Dn5hVs2X9epk58XAxuXDmHkOADKFnSANP9/szzfO/TUjFpTD+YmFp8sR4VgUCA0g1roVy3drDu1xWPJsyHcOPePKvrWpqj+qLJKN2wFjS0tRGx8zAeT/GHOCtLUqe0c21Umz8RJWwsIcrIxDP/v/FmzU6p81j37YJKYwdCq7QRMiJj8HC8H95evKm0yyTKy1cDwWvXrkm9Ll++vFRZuXLl1Crw+1Qdx1KYMb4axs+8h/uPk1GzmhEWzaiJcTPu4kFoikx92/IlsWCaI2b5P8K5y/EwMdbB3Mk1kCMSY9fBcADAwJ8q4IeGJhg5+TZi4zPRyMkY83+vgSHjbyEmLgM6OhoImFUTZy/FY8q8B9DS0sCYwZUxdawDfvd7+K1vgVopjs8bABbPqIkXr1PRe9g1pGeIUMexFBZMc0RGpggXruYdhFLRPLx3CysWz8SkmQGwr1YToQ/vYoHvOEz2XQI7B0e5xyxfOB1aWlowMy8HsUj2F7OM9HTMmjQc1WrWhbGxGdLT33+xDRtWLYGuXgmFXA/JV75/N9gM7onY4xcgzvnyL9MCbW04H1mHmCNncOvncdAy1IfT7j9RffEkPBiTu4KGvn1FNAxag7uDJiNq33EYOFSCc/AGZL1NRtSeYwAAq14dUXW2Ny637YfU0Oco26UtGuwPxLkGXfD+pfBLTaBPiNRsLJ+y5GuM4B9//IGBAwdi2bJlMmMC1XmMYL8fK+BISBTuP04GANx7lIwjIVH4qWt5ufXbtjDHnQdJOHc594d3fEImlgQ+Qc9O1pI67VuXxcYdrxEbnwkAuHQ9AWcuxaGDWzkAQK3qpWBSWgeBG59DJAIyM0UI+Osp6jiWhmVZPWVertorjs+7TGltVK1iiK17hUjPyP0hdft+Em7cSYRTndLKulQCsHfHejRzdYd9tdwlsapWr4Vmru44tGdLnsf4zPTHuKkL4NLEVe5+XT09/PH3Lvw65ndUsnP44vtfuRCC508fo51nj8JfBH3Vm3W7cKFxD4TNWIqc1LQv1i3XvR10zU0QOjUAEImQnZSChxPmo/zAHtA2KQMAqOQ9EAlnryFq33EAwLvHz/E8YA2q+AyRnMdu6gg8X7IGqaHPAQBRe4ORcO46bIf3VtJV0vfg0aNHcHd3R4UKFWBra4t58+bl2b196dIlWFtby2w6OjoYNmyYpN7o0aNRqlQpqTq2trYFale+AsE2bdqgZs2aOHfuHNLS0uDi4oIDBw4AUN8+ek1NAWrVKIWL1xKkyi9cTYBLfWO5x5QsoSXzG0xmpgjlLPRQ1lwXAKBfQlPmnmZmiVCnRqnc/SU1IQbwaRWRSIycHDFq/1uHFK+4Pu/EpCxERqejmYupZL9xaW1UszfEnftJRb4uki87OxuhD+6gXoMfpMrrNWyC2zcuKf39E+JjsfZ/izF45CRoamoq/f0of0xbuiD2+HmIs7MlZcm3HiIrIQmmLV0AACYtXBB9+JTUcdGHTqFUPUfomBlDz7os9O1sERN0WrpOUAjM3PIedkCyPsxVUMamaHFxcXB1dYW7uztevnyJCxcuYPPmzfD395dbv1GjRhAKhVLbmTNnoK2tjTFjxkjqCYVCzJ8/X6rey5cvC9S2rwaCoaGhMDY2xtixY7Fz506Eh4dj8ODBmD9/Pu7fv4/GjRsX6A3/K0oZakFXRwNx8RlS5fEJGdDT1YShvmyve8j5WDjVKYPmjU0hEABmJjr4tV8lAIBJGR0AwMnzsfi5hw0sLfQgEAAu9Y3h2sQMxv/uv3HnLTKzRPi1b0XoaAtQQk8Do36pDF1dDck5SPGK6/MWiwHvGXdRx7EU/lpUFz6j7OH3uyOWrX6K0xfjlHzV6utdShKysjJRxsRUqryMsSkyMzPw7l2y0t5bLBbjf0vnwNWtU55d0FQ8dC0tkBEZI1OeHhENPStzAICelQUyIqTrfHitZ2UBPSuLf4+RrfNhH+WPKi0fExgYCDMzM4wePRoCgQBWVlaYPXs2/P39kfXJ+NIv+f333/HLL7/AweFjb0J4eDjKl5ffK5VfXx0juGLFCgQGBsLe3h6dO3dGs2bNULFiRcyePRsxMTEYMWIEQkJCpI5xdZXfLQIAGRkZyMiQ/mGqq6tbyOZ/OzWqGmH2pOqS1yvWPAMgnZmTei2nx/zuwyRMmfsAfX+0wehBlSGMeI+/N7/EDw1NkJ2Te2DA/56gv1cFLJ5ZE5qaAly6noBdB8Ph3qosAOBdag5GTrqDof0qYmtgQyQmZ2HL7jdwdDBCTo56ZmeV4Xv5vAHAwlQXJUtq4vb9JLwWpsGuogGaupji6q23SE3LUeh1q6uwx/fwx/ypktd9fhkFABAIpH9XlgyFUeI/tcP7tyH1XQq6/fTL1yvTNyXOypIfJIjFwL/fDXFWtsz4UEmGSSCAKCs3myi3jhoPtfre5BWrFDZeCQkJgaenp1SZh4cHunfvjlu3bqFhw4ZfPP7WrVs4ePAgXrx4IVUuFAphY2NTqDZ98NVAcPny5fDz88Px48exdetW+Pv7IzMzE9bW1qhcubLcdQW/FAj6+fnB19dXqmzGjBkAWhbuCr6RB6HJ6DrgslTZ77/lwNRYBy/ffBxXYmqsg/SMHKS8y/78FACAyzcScPnGx+7F8la5A8EjotIBAFnZYqze9BKrN72U1BnatyIioj4OKn8lTMOUuQ+kzjtqUGWE/3sOKrrv5fO2tNDDgmmOGOZzG2HP3gEADh2Pwvypjhg9uAr8/ggt+sUS7B1q4s/1+6XK/rd0Dt4mxMHapqKk7G1CHHR0dGFgaKSUdrx++Qx7t62H76JAaGkV6Amg9A2kh0dDz9Jcply3nDnSw6Nz6wijZOp8eP2hzoeytGevpV5nfLKfvk6ZCz/nFavMnDmzUOcLDw+HpaWlVJmuri5MTEwQHh6er/YMGDAA5uYfv1s5OTmIjo5GcHAwBg0ahNjYWNSqVQvz5s1DjRo18t22fP1PY2BggC5duqBLly6Ijo7G0qVL8ddff6FFixaYMmVKgf7Dmjx5Mry9vaXKdHV1caL75TyO+H5dufUWLk4muH4nUVLWsJ4xrt58m+cxuroayMj4+Jtgw7pl8DA0WRJIaGgAGhoCZGeLpeocDI7M8xyVKujDUF8Lt+5+bAcpXnF83g52hsjMEkmCQCA3+XDt9lt0aldOUZdGctSu64zb1y+iZp0GkrK7N6+gVj1npb3n/TvXkZqagvHDe8ns+6lDYwweOQmubh2V9v70ZbHB51Bz5SwINDUhzsnNxhtUrwIdM2PEn8r9GRZ7/DzM2zXHm7W7JMeZtW2CpNsPkRmTO3Es6c4jmLs3x8sV/3ys06YpYoLPfcOroS/JK1aRJzY2FnXr1s3zXN7e3tDW1oaGhuxoPIFA8NUxiU+ePMHevXsRGir9i//bt29haWkJTU1NnDx5Erq6uli6dCmaNWuGe/fuyQSeeSnwk0UsLCzg5+eHO3fuwNDQENnZ8jMhedHV1YWRkZHUpgpdw/Js2/sGHq3Lorq9IQDA0cEIHd3KYeveN3LrO9crg39WOMG6XG5WqLKtPvp0t8H/NnxM9U7zdsCE4XbQ0RZAIAB+6mINHR0NHD4RBQAoXUobu/52RiOn3AkKpYy0MG6YHTbufI2U1IJ9FlQwxfF5PwhNhra2Bnp1LQ9Nzdxuo4o2JdHNwxJXvhCAUtF5dOmF0yeC8DQ0N/se9ugeTh7bD88uskGaorTv1BNbD16U2n4d8zuqOdbF1oMXGQQWs5ig08iMTYC97xhAQwNaRgaosXQahBv2IDMu99/jy5WbYOLaCOaeuT1j+vYVUWXSMDxbtFpynueLVqPSuEHQt7MFAFh0bAXTNj/g1cpN3/yaVJlILFbaVpBYxczMTGZix6ebt7c3rK2tERERIXVceno6EhISYGVl9cXrDAwMRJMmTVCpUiWpclNTU7x+/Rpjx46FoaEhdHR0MHHiRJibm0sm9OZHofsebGxsMHbs2MIe/p9w92Ey/P54jEmjq8LQQAsp77Ixb+lj3Hv0cSD5nnUu2L5PiO37hbhy8y32H41EwKya0NbWQEJiJhYsD8Ote4mS+ivWPseYwZWxc40LcnLEuPswCWN+v4PMrNzfGBKTsuC3LBSD+9jCZ6Q93mfk4MDRSGzdy7WnlK04Pu/o2AyMnnIH/XpWQPcOVtDQAFLeZSPoRBQ/cyVzqFEbv475HYHL5iH1XQr0DQwx7LepqFr945OTRvTvhPadveDR+adibCkpi56VBRqf34GH4/0QtfsoxDk5uOo5CDWWzUCrF2cgFokQufsoQqcslhyT9uw1rnUaiuqLJ6PmipnISXuPsNnLEbnjsKROxPYgaBkZwGnfX9Ay0Ed6RDSudRqKtOfyf6kk1efm5oaNGzdizpw5krKTJ0/CxMQE9erVy/O4rKwsbNy4EQsWLJC7XyQSyWQac3JyCrS0n0BchHnSe/bskVvevn176OkVbE27Jh3OFLYZpGLOH2zOz1uNnD/YHDfDuPC1uqhnb4Ig7arF3Qz6Rjyyim+ccr/pUUo794ZZZb9eqQDevn2L6tWrY9q0aRg+fDgiIyPRpk0b9OnTB5MmTcrzuGPHjsHd3R2RkZGwsJCeVf78+XO0bNkSq1atgpubG3JycrBgwQL4+/vj8ePHMDMzy1fbCtw1/KkBAwbg0KFDOHjwIA4ePIj+/fvj0KFDSEv78qKcREREROqiTJkyOHHiBHbu3AlLS0s0atQIXl5emDhxoqROjx490KOH9ALyQUFBcHR0lAkCAaBSpUr43//+h1mzZsHKygrm5uYICQnByZMn8x0EAvnMCJ49e1bqdYkSJdCgQQPY2dnhyZMnkvKKFSvKTG3OL2aI1AczguqFGUH1woygeinOjGDfaZFfr1RIG2erz2S8fI0RbN++PZo1ayaZ2fL8+XOEhobycXNERERULPisYcXIVyBYrlw5HD78caCrvb09gNw+74CAAAC5i2EmJSUhICAAQ4YMgYGBgRKaS0RERESKkq9AMK9M34gRI5CSkiJ5PXr0aKSkpED02YrpRERERIqkzAWl1UmRlq4fPXq03HIjI+Wsuk9EREREilOkQLBs2bKwtrYGkNs1HB4eDmtrazx//lwhjSMiIiKSpwir39En8hUIJicnY+PGjQCkb3yFChVkZg0zCCQiIiJSDfkKBDt06IBz5z4+A/HHH38EIDt2kLOGiYiI6FsQcz6CQuQrEFy9erXc8rS0NMkag2KxGO/fv8e5c+fg7OwMHR0dxbWSiIiIiBSuSGME69ati0WLFkleOzk5YdGiRVi7di1MTU2L3DgiIiIiebiOoGIUKRA8ePCg1OusrCzExsYyCCQiIiKl4mQRxcjXs4Y/fRaePCKRCE2aNMH9+/dhZ2enkIYRERERkXLlKxDctWuX5O/NmjVD69atsXr1amRkZAAA/v77b6SmpqJ27drIyspSTkuJiIiI/iUWiZW2qZN8BYKfpl9fvHiB8ePH4+LFi6hWrRr8/f0xffp0bNy4ERoaGtDX10dmZqbSGkxEREREipGvQPDzZWFcXV2xbt069O7dGxMmTECTJk1Qs2ZNAECJEiWQk5Oj+JYSERER/YsZQcUocEYQAC5fvoxu3brhxIkTuHbtGmJiYiSzhzU0NKClVaQ5KERERET0DeQrYvs8I7ho0SIMHjwYHTp0gEAgwJ49e+Do6IgOHTpAJBJBW1tbKY0lIiIiAgCRmAtKK0K+AsG3b99i1qxZEIvFSE5ORsOGDfHixQts3boV9vb2kvUDRSIRNDTylWQkIiIiomKWr6ht6tSp0NfXh4GBAaZPn44SJUogJSUFly5dwsiRI2FpaYm4uDikpKTAwcFB2W0mIiIiNccxgoqRr4zguHHjIBaL83yW8JMnT7Bp0yYsWLAAQ4YMUWgDiYiIiD6nbgGbsuQrEIyLi4O7uzuWLFmCJk2aAADatWsntUzM27dvUbVqVfz444/KaSkRERERKdRXA8F3797Bzc0NrVu3lgSBQO7M4ZMnT0pep6amonfv3jh27Bjc3NyU01oiIiIi8BFzivLVQDA7Oxv9+vXD6NGjpcoFAgHq168vVfbXX3/By8sLoaGhMDc3V2xLiYiIiEihvhoIli5dWiYIBIBr167JlHl4eODu3bsMAomIiEipRCIuH6MIhV7rpUqVKnLLy5cvX+jGEBEREdG3w0eAEBERkcrhrGHF4OrPRERERGqKGUEiIiJSOWI+Yk4hGAgSERGRymHXsGKwa5iIiIhITTEjSERERCqHGUHFYEaQiIiISE0xI0hEREQqR8TJIgrBjCARERGRmmJGkIiIiFQOxwgqBjOCRERERGqKGUEiIiJSOWIRxwgqAgNBIiIiUjnsGlYMdg0TERERqSlmBImIiEjl8FnDisGMIBEREZGaYkaQiIiIVI6IYwQVghlBIiIiIjXFjCARERGpHC4foxjMCBIRERGpKWYEiYiISOVwHUHFYEaQiIiISE0xI0hEREQqh+sIKgYDQSIiIlI57BpWDHYNExEREakpZgSJiIhI5XD5GMVgRpCIiIhITQnEYjE72YtBRkYG/Pz8MHnyZOjq6hZ3c0jJ+HmrF37e6oWfN6kyBoLFJDk5GaVKlUJSUhKMjIyKuzmkZPy81Qs/b/XCz5tUGbuGiYiIiNQUA0EiIiIiNcVAkIiIiEhNMRAsJrq6upgxYwYHFqsJft7qhZ+3euHnTaqMk0WIiIiI1BQzgkRERERqioEgEVE+Xb16FVFRUfmqKxaLkZWVpeQWEREVDQNBBfjrr7/g5eX11Xrx8fGSv3t5eWH9+vX5fo9Dhw6hf//+AIB9+/ZJ/k7fj+7duxfoMyXVkpqaCnd393wHguvXr4erqysSEhIAAJqamnB0dJTazM3NsWLFCmU2W+29ffsWKSkp3/Q9R44ciUePHkmVOTk54fbt23LrHz16FCKRCK1bt8b9+/exe/duREZGIicnB7Vr10ZOTs43aDWpKz5r+BtydHREcHAwatas+dW6sbGx6NKli+T127dvERcXhyZNmiAhIQHx8fFo0qQJAGDYsGHo3bu30tpNyiEUCuHg4IB3794Vd1MoH1auXAmRSITu3bt/sd7ly5dhamqKvn374sKFC+jYsSPOnz+PEiVK4P79+1J1p06dqswmE4CNGzdiw4YNOHr0KMzNzbF48WLMmTMHpUuXlqnbvXt3LF68WPJ60KBBOHjwIAwNDaXqRUZGIigoCC1atJA5R0pKCgIDAzFlyhQ8ePAAx48fx2+//fbFNi5YsABpaWkAgPfv32Po0KG4f/8+Xrx4gcTERGhqahb4uonyi4HgN3LlyhW8f/8eNWrUyFd9MzMzHDlyBA8ePAAAXLhwASEhIZg2bRrOnj2LM2fOYNq0adi+fTvevHmjzKaTHAMHDsTZs2elyqKionDu3DnMmTNHqnz06NEYPXr0t2weKdiVK1ewcOFCzJw5E6VKlZJbx8zMDB4eHpLXmpqaWLVqFa5evQog9we8o6Oj1DExMTGYPn268hpOGDNmDMLDw+Hu7i75LH777TfMnDkzX8cvWLBApgemXbt2edY/ceIE7OzsYGlpiW3btuHu3btffY8RI0ZAKBQCAJ48eYKhQ4eibNmy2LZtG4yMjHD06FFJXSsrq3wlE4jyi4FgIZQtWxZpaWnQ0JDuWf/8N8yZM2dKfhNcuXIlxGIxLC0tAQBJSUk4cuQIJk2aJKlvZ2eHc+fOSV4fOHAAgYGBaNu2La5fv453797hxIkTePToESIjI3HixAmYmJigWbNmyrlQytPatWtlyrp37w5PT0922/8Hbd++Hbt27YKmpibi4uLk1vk0a5STkwMvLy94e3ujUaNGAMCMYDFasGABzp07900ya1u2bEHnzp0BABcvXpT03ORl/vz52LZtGwDg2bNnEAqF0NPTQ3R0NHR1dSESibBixQo8f/4c2dnZGD58OANBUigGgoV09+5d2NraAgASExNx7Ngx9OzZU27d69evY//+/bh//z7Kly8PIHeMYLt27b4YNJw5cwZCoRBHjx7F69evoaWlhaNHj0q6hj/8lnj06FH06NEDY8aMUeg10peNGjUKR44ckbyWlxGcMGEChg4dWhzNIwUyNDREv379vlinevXqkl/KNDU1MXjwYHTs2BEbN26Eu7s7M4LFSCAQSP3CHBAQgL///luqjq2tLc6dOweBQFDo94mKisLBgwexb98+pKen49SpU7h8+TIWL16MmJgYuLm5QVtbGwBw8uRJVK1aFZMmTYK3tzeGDh2KqKgoNGzYEL///jvs7e1hY2ODVatWwd3dHZMnT0b58uUxfPjwQrePSB4GggoQEhKChQsX5hkIli1bFoGBgZIgML9WrVqFqKgoTJ8+Hfr6+li/fj0EAgGOHj2KI0eO4I8//sCTJ0+wdu1apKamKuJSqACWL19e5HOkpqZCS0v6n2GTJk1w+vTpIp+bFMfX1xdTp06FlpaWJFAIDw/H1q1bMX78eDx48AC9evWSOqZt27bYv3+/5N89B/x/H8RiMcaNG4erV69iwoQJcHFxwalTp7Bo0SKZINDc3Bxz5syRGe4B5GZ4P/fHH38gIyMDWlpa2Lx5MypXrizpjnZycsLff/+NOnXqSB0THByMyZMnY9y4cXjz5g06d+6M0aNHo1GjRhAKhQgPDweQmy1s1aqVgu4C0UdcULoQzMzMcPPmTcl/8CNHjoShoSH8/Pxk6gqFQri4uOT73J06dcKff/6JJ0+eYMSIEbh58ybq1KkDBwcHufXXrFmDuXPn4ueff4aZmVnhLogKbOHChVi2bBn09PS+WC81NRUbNmxA27ZtZfZxsohqWbp0Kfbt24e//voLDg4OGDduHNLT0/Hnn38iLCwMHTt2xOPHj6WOyczMRFpaGtavXy+TgfrUtWvX5AYWVDRPnjxBgwYNIBaL4ezsjODgYMyePRsGBgaoWLEiNm7ciD179qB///5o1KhRkbL3r169Qu3atWFoaIh169Zh6tSp8PHxkUz6yysQDAoKQrly5WBjY4PWrVvj5MmTMDExgY+PD+Li4pCSkoIdO3bA3t4ex48fR4UKFYpyS4hkMCNYCBkZGVKPEjp06BC2bduG9PR03Lp1SzImCACsra0lg4ALws7ODlu2bMHMmTNx4sQJZGdny62nq6sLb2/vgl8EFUlaWhr69++POXPmIDs7G6mpqShVqhRycnKQkpIiGS/arl07ZGZmFm9jSSF+++032NjYoF27dujQoYPURAAjIyMkJSXJHLNp0ybcvHkTBgYGGD9+PExNTXHixAmMHz8effr0wenTp1GlShVmC5XEzs4OiYmJuH79OsaPHw8AiI6ORsWKFdGxY0f4+flh6tSpOH36NP73v/9JjvP09MStW7ckwfmrV68QGRmJFStWYMWKFZJ/3zExMVi7di26d++O3bt347fffpNk81etWoVatWp9tY0fJhht27YNLi4uMDExAZA7yUwkEqFbt264evUqRCIRg0BSCgaCBZSVlYV3797ByMgIAHDr1i2IRCI4Ozvj9evX6Ny5M86cOSOTwVu/fj1GjBiRZ9YuIiICZ8+elcoempqaAgA6duwoN6ME4KtLWZBy2NjYSH54X7hwAVOnTsW5c+dw79499OnTRzIpoGnTpihXrlxxNpUUqGvXrqhcuTKcnJxQpUoVSVeimZkZEhMTkZ2djZUrV2LkyJEQCATw9/fH4sWLcebMmWJuOX1w7do19O3bFxoaGvjzzz/RoEEDLFy4UCYju3nzZsnyMB/GgwPApEmTJEHlp2O8f/31V2hra0sCwZkzZ+LixYuS/fHx8WjdurVkKMiHyYFTp07Fvn378PjxY9jb26NKlSqIiopC3bp1ce7cOQwaNAidO3f+6hhVosJiIFhAr169grGxsaRLcNOmTfj5558hEAhQoUIFzJgxA15eXrhy5YrMA8g/ZBHk+by74FMJCQmFyiqS8gwcOFDy94iICFhZWcmtN3ny5G/VJPoGbt++LckkxcXFwcXFBUFBQahRowbs7Oxw7949+Pr6YuTIkdi+fTuys7PRrl07BoLfibCwMLx69QpOTk6Ii4vD2LFj0aVLFyxatAhGRkYYNGhQoWcWlyxZUur1nj17pF7n1TU8Z84cuLq6YsGCBTh27Bg2bNiAW7duYenSpQByx5oOHToUTZs2LVS7iL6GgWABXblyRbIWYHp6OrZs2YJLly5J9g8bNgzbtm3DnDlzMHv27CK/n4GBAU6dOiWz7MQHH7oRqPgcOnQozyV8hEIhPDw8cO/evW/cKlKk58+fY9asWTh06BCWLVsmmRhia2uLNm3aSMYIjho1CnXq1EFaWhrGjx+PefPmFWkWKilGWloaEhMTsWnTJkyYMEHy59ixYzFp0iTcuXMHffv2xYYNG3DhwoVv3r579+7hxYsX8PHxQVBQEHbt2gUAEIlEGDhwIBo2bIgRI0bg7NmzBZ50SPQ1DAQLaOvWrXBzc8OhQ4ewY8cOZGVlYcqUKYiLi0N0dDSioqJgYmKCJUuWoHfv3lJdxEFBQahSpYrc8+a1KPSIESNgZGSEdevWYffu3ahVqxYiIyPRvn17VKhQAYMGDcLbt29RpkwZpVwv5e39+/eYP38+rl27hsDAQAC5y1SkpaUhMzNT0k2kp6eHEydOoE2bNnLPIy9QqFChAl6+fKnM5lMBvHnzBiYmJggLC4OxsbGk/Ndff0XXrl1hYGCAMWPGYNu2bVi4cCFevXoFW1tb/Pzzz/D29saOHTukzvfhB721tTUAwMHBAWFhYTJZJSq6oKAgDB06FI0bN8bdu3cxadIkGBoa4tSpU6hevToAoHbt2rh58ybu3LkjeT60l5eXpOfn0x6ZefPmSR4LGBcXB09PzyK3ccyYMWjUqBE8PDygpaUFPz8/zJkzB97e3sjIyMDZs2exfPlyODs7459//uHsYVIoBoIFkJWVhbCwMAQGBkoGEo8cORJWVlawsbFBxYoVUbFiRWhra+O3337D5cuXpQJBDw+PfHcNp6eno0WLFoiNjUX37t1x6tQpyQ+NcuXK4ebNm7h48SLWrVuHyZMnIzg4GHXr1lXatZO02bNnY+nSpWjZsiVOnz4NAwMDAEDFihWhq6sLfX19iMVimJiYYP78+WjdujU4QV91NW/eHM2bN5e7z9zcHEDuOMGnT59Kyk+ePAmBQICAgAAEBAR8k3aStNevX6NXr17YunUr2rdvj+3bt+P333/Ho0ePIBKJoKmpCZFIhPfv30uWcnry5AmA3Mkb8sYITpkyRe4YwcK6e/cufv31V6Snp2Pr1q1o2rQp1q9fjzlz5iA9PR2HDx+Grq4uxo8fjxIlSmD37t0MBEmhuHxMAb17907yQ/9LxGJxkbuEEhISpLIPecnKypIsUkrfxuvXr6GhoSEJzono+xQVFYWyZcvK3ZeRkYHs7GxoampCR0dH8rSomJgYGBkZySwPlZiYCA0NDclkwbi4OJQsWbJImVyRSITHjx9LspMfvHv3Dvr6+hxaQErHQJCIiIhITWl8vQoRERER/RcxECQiIiJSUwwEiYiIiNQUA0EiIiIiNcVAkIiIiEhNMRAkIiIiUlMMBImIiIjUFANBIiIiIjXFQJCIiIhITf0fwZPGmU4X8RcAAAAASUVORK5CYII=" alt="広告費・売上・気温・返品件数の相関行列を示すヒートマップ">
  <figcaption>相関行列のヒートマップ</figcaption>
</figure>
<p>この<code>coolwarm</code>配色では、赤系が正の相関、青系が負の相関、白に近い色が0付近を示します。まず色で気になる組み合わせを見つけ、<code>annot=True</code>で表示した数値を確認しましょう。</p>
<h2><span id="toc9">正の相関・負の相関・弱い相関を同じデータで読む</span></h2>
<p>先ほどの相関行列から、特徴の異なる3つの組み合わせを見てみましょう。</p>
<pre class="line-numbers"><code class="language-python">print("広告費と売上      :", round(corr_matrix.loc["広告費", "売上"], 3))
print("広告費と返品件数  :", round(corr_matrix.loc["広告費", "返品件数"], 3))
print("売上と気温        :", round(corr_matrix.loc["売上", "気温"], 3))</code></pre>
<pre class="colab-output"><code>広告費と売上      : 0.999
広告費と返品件数  : -0.999
売上と気温        : 0.122</code></pre>
<p>このサンプルでは、次のように読めます。</p>
<ul>
<li><strong>広告費と売上：0.999</strong> → 強い正の相関がある</li>
<li><strong>広告費と返品件数：-0.999</strong> → 強い負の相関がある</li>
<li><strong>売上と気温：0.122</strong> → 少なくとも強い直線的な相関は見られない</li>
</ul>
<p>ここで、<code>0.122</code>だから「売上と気温には絶対に何の関係もない」とは断定できません。<code>corr()</code>が捉える関係、とくに標準のPearson相関は<strong>直線的な関係</strong>が中心です。曲線的な関係や外れ値の影響は、相関係数だけでは見落とすことがあります。</p>
<p>このため、<code>corr()</code>は<strong>結論を自動的に出す道具ではなく、詳しく見る組み合わせを探す道具</strong>として使うと理解しやすいです。</p>
<h2><span id="toc10">Pearson・Spearman・Kendallはどう使い分ける？</span></h2>
<p><code>DataFrame.corr()</code>は、標準では<strong>Pearson（ピアソン）の相関係数</strong>を計算します。初心者が連続した数値データの直線的な関係を見るなら、まずPearsonから始めればよいでしょう。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">method</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">ざっくりした考え方</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">初心者が使う場面</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>pearson</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">数値の直線的な関係を見る</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">まず基本として使う</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>spearman</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">値の順位にもとづいて単調な関係を見る</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">順位関係を重視したいとき</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>kendall</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">順位の一致・不一致にもとづいて見る</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">順位データなどで候補になる</td>
</tr>
</tbody>
</table></div>
<p>指定するときは<code>method</code>引数を使います。違いが見えやすいよう、ここだけ小さな比較用データを使います。<code>x</code>が増えるにつれて<code>y</code>も必ず増えますが、最後の値だけ大きく離れています。</p>
<pre class="line-numbers"><code class="language-python">method_df = pd.DataFrame({
    "x": [1, 2, 3, 4, 5, 6, 7, 8],
    "y": [1, 2, 3, 4, 5, 6, 7, 100]
})

print("Pearson :", round(method_df.corr(method="pearson").loc["x", "y"], 3))
print("Spearman:", round(method_df.corr(method="spearman").loc["x", "y"], 3))
print("Kendall :", round(method_df.corr(method="kendall").loc["x", "y"], 3))</code></pre>
<pre class="colab-output"><code>Pearson : 0.624
Spearman: 1.0
Kendall : 1.0</code></pre>
<p>この例では順位そのものは完全に同じ方向へ動いているため、SpearmanやKendallでは強い関係として表れます。一方、Pearsonは数値の直線的な関係を見るため、最後の大きな値の影響を受けます。</p>
<p>ここでは**「methodによって見ている関係が違う」**と分かれば十分です。Spearman・Kendallの統計理論や数式には深入りしません。通常の数値データで迷ったら、まずPearsonで確認し、分析目的に応じて別の方法を検討しましょう。</p>
<h2><span id="toc11">corr()でつまずきやすい3つのポイント</span></h2>
<p><code>corr()</code>は短いコードで使えますが、実際のCSVやExcelから読み込んだデータでは、データ型や欠損値に注意が必要です。</p>
<h3><span id="toc12">1. 数字に見えても文字列型になっていることがある</span></h3>
<p>たとえばCSVから読み込んだ<code>広告費</code>が文字列になっていると、そのまま数値列として分析できないことがあります。まず<code>dtypes</code>で型を確認する習慣をつけましょう。</p>
<pre class="line-numbers"><code class="language-python">df_text = df.copy()
df_text["広告費"] = df_text["広告費"].astype(str)

df_text.dtypes</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">0</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">object</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">int64</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">int64</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">int64</td>
</tr>
</tbody>
</table></div>
<p>型が混在するDataFrameでは、初心者には<strong>数値列を明示してからcorr()を使う方法</strong>が分かりやすく、安全です。</p>
<pre class="line-numbers"><code class="language-python">numeric_df = df_text.select_dtypes(include="number")
numeric_df.corr().round(3)</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p><code>DataFrame.corr()</code>には<code>numeric_only</code>という引数もあります。数値列だけを対象にする書き方として<code>df.corr(numeric_only=True)</code>もありますが、<strong>なぜ列が対象外になったのかを理解するためにも、先に<code>dtypes</code>で型を確認する</strong>のがおすすめです。</p>
<p>数値列だけを選ぶ方法は<a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方</a>、文字列になった数字を数値型へ直す方法は<a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>で詳しく解説しています。</p>
<h3><span id="toc13">2. 欠損値があっても「0」として計算されるわけではない</span></h3>
<p>実データには欠損値が含まれることがあります。<code>corr()</code>では、対象となる2列について利用できる観測値を使って相関を計算します。<strong>欠損値を勝手に0へ置き換えて計算するわけではありません。</strong></p>
<p>たとえば一部の<code>売上</code>を欠損値にして確認します。</p>
<pre class="line-numbers"><code class="language-python">df_missing = df.copy()
df_missing.loc[[2, 7], "売上"] = pd.NA

print(df_missing[["広告費", "売上"]].isna().sum())
df_missing[["広告費", "売上"]].corr().round(3)</code></pre>
<pre class="colab-output"><code>広告費    0
売上     2
dtype: int64</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p>相関係数の計算に必要な最小データ数を決めたい場合は、<code>min_periods</code>を指定できます。次の例では、広告費と売上の有効な組み合わせが10件しかないのに11件以上を必要とするため、この2列間の相関係数は<code>NaN</code>になります。</p>
<pre class="line-numbers"><code class="language-python"># 計算に必要な有効データ数を11件以上に指定
df_missing[["広告費", "売上"]].corr(min_periods=11)</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.0</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
</tbody>
</table></div>
<p><code>min_periods</code>は、少ないデータだけで相関係数が計算されるのを避けたい場合に便利です。PandasではPearson相関とSpearman相関で利用できます。</p>
<p>欠損が多いほど、組み合わせによって計算に使えるデータ数が変わる可能性があります。相関係数を見る前に「何件のデータが残っているのか」を意識しましょう。欠損値の場所や件数の確認は、<a href="https://pythondatalab.com/pandas-isnull/">Pandas isnull()で欠損値を確認する記事</a>につなげて学べます。</p>
<p>なお、isnull()記事で扱っているmissingnoの「欠損パターン同士の相関」と、ここで扱う<strong>売上・広告費など通常の数値変数同士の相関</strong>は目的が異なります。</p>
<h3><span id="toc14">3. NaNが出たら「計算できる変化があるか」を確認する</span></h3>
<p>相関係数が<code>NaN</code>になる代表例の1つが、<strong>すべて同じ値の列</strong>です。値が変化しない列では、通常の相関係数を計算できません。</p>
<pre class="line-numbers"><code class="language-python">df_constant = df[["広告費", "売上"]].copy()
df_constant["固定値"] = 1

df_constant.corr().round(3)</code></pre>
<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; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">固定値</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">固定値</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
</tbody>
</table></div>
<p><code>corr()</code>で<code>NaN</code>を見つけたら、エラーだと決めつけず、<strong>列の値がすべて同じではないか、欠損値が多すぎないか、計算に使えるデータが十分あるか</strong>を確認してください。</p>
<h2><span id="toc15">corr()だけで判断せず、散布図で形を確認する</span></h2>
<p>相関係数は複数列を一覧で比較するのに便利ですが、<strong>点がどのように散らばっているか</strong>までは分かりません。</p>
<p>たとえば<code>広告費</code>と<code>売上</code>は相関係数が約0.999でした。この関係を散布図でも確認してみましょう。</p>
<pre class="line-numbers"><code class="language-python">import matplotlib.pyplot as plt

plt.scatter(df["広告費"], df["売上"])
plt.xlabel("Ad cost")
plt.ylabel("Sales")
plt.title("Ad cost vs Sales")
plt.grid(alpha=0.3)
plt.show()</code></pre>
<figure class="colab-figure">
  <img decoding="async" src="data:image/png;base64,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/PHH37k3gN0RdIAIU1xcrPPPP18bNmwI+Hn88ce1fv16VVZWqlevXqqvr1dzc3PA73799dfH3L7L5dL27ds7tebgwYPatWuXevfu7R/LysrSiy++qC+//FJZWVmaOHHiMbffnuuvv17/8z//o3379unVV1/V9ddfHzB/vH+nd+/eWr58uXw+n1avXi1Juv/++3XDDTfojDPO0BNPPKH33ntPr7766lG306tXL0mHL3TOzs5u85OSkuJf+/3vf1+lpaX67LPPFBcXp9zcXB04cCDomoFIQNABIsjevXv10ksv6eqrr9a5554b8JOfn6/k5GQtW7ZMF198sXw+n5588smA3//9739/zL8xceJE1dXVtfkH/fXXX/c/UXnChAmqq6vT66+/HrCmuLhYxhhNnDhR0uFn/Xg8HkmH72h64okn1NTUpPLyckn/d4QpmNvMp0yZoqamJv3yl7+Uy+VSbm6uf+5Yf+fbamtrdcstt6ipqSlgfP/+/ZLkv7387bff1tChQ/XEE09o0qRJOuecc7Rv3z7/32zPoEGD1K9fPz366KNttj979mx/TQcOHPDPDxw4UA8//LDcbrc+/fTTY/YCiCghPnUGoAstXrzYREVFma+++qrd+Ztuusn07t3bNDc3mwkTJphTTjnFPPbYY2bjxo1m3rx5ZtCgQSYpKSmou65OO+00/+8uW7bMJCYmmqKiIv+a0aNH++/M2rBhg3nggQdMfHy8ueaaa/zb+uUvf2nOOuss88ILL5h//OMfpqioyMTExJjNmzcbYw5ffBsdHW1mzZpl/vd//9ds2LDhqPt/9dVXG4fD4a8j2L/zbX//+9/NqaeeaoYNG2aeffZZ89FHH5mVK1ea7Oxsk5mZafbt22eMMWb+/PmmW7du5oknnjAbN240ixcvNueee66JiYkx5eXl/u3pWxcjr1q1ykRFRZkRI0aYV155xaxbt87k5+ebxMRE88UXXxhjjJk8ebJ//sMPPzQ33nijSUxMNI2NjUftARBpCDpABBk2bJi5+OKLO5x/7733jCTz/PPPmwMHDpibbrrJ9OrVy3Tv3t3853/+p9mxY4dJT08/atAxxpj9+/ebgoICk5aWZmJjY83gwYPNkiVLAtYcOHDA3HrrrSYjI8PExMSYM88809x///3G6/X61zQ2NprbbrvNZGRkmNjYWDN06NA2d2otWLDA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AE4Egg6AsFBcXKxrrrlGMTExmjp1qoqLiyVJ+/fv18SJEzVq1CjV1tbqvffe01//+tejbmvOnDkqKSnR6tWrVVNTo9tvv11XX321WlpaVFdXp/PPP1+jRo3Sl19+qY8++kjbtm3TJZdc4j+KdO211+qRRx7Rzp079etf/1oHDx5UQkKC3n//fUnSjh079PHHH5/QfgCwBi/1BBByb7/9tn784x+rpqZGMTEx+uSTT3TeeeeptrZWb7zxhmbNmqWamhpFRUVJkhoaGpSYmKi33npLF110UcC2WlpadNppp+mpp57SFVdcETDerVs33XPPPXrhhRf0j3/8wz+3a9cuJScn691339X3v/995eTk6LzzztNvfvMb9enTx79u69at6t+/f1ieVgPQPo7oAAi5xx9/XB6PRy6XSz179tSFF16o1tZWPf3009qyZYtOP/10f8iRpISEhA63VV9fr4MHD2rw4MEB4926dZN0OKwMGjQoYK53797q3bu3tm7dKkn629/+pm7dumnYsGH6j//4D9XU1Fi0pwC6GkEHQEjt3btXf/7zn/Xee+9p3759/p8HH3xQy5YtU2pqqqqrq9Xa2ur/nZ07d3a4PZfLpfj4eH322WcB44cOHZIk9e3bV59//nnA3O7du7Vr1y717dvXv42HH35YX375pXr16qXrr7/eqt0F0MUIOgBCasWKFTr99NN1zjnnBIxfddVVqqqqUr9+/eR0OvXrX/9aXq9X9fX1uuaaa/xHaL6tW7dumjFjhubMmaMvvvhCkvTBBx/orLPOUn19vfLz8/Xll1/qt7/9rYwxOnDggKZNm6YRI0boBz/4gRobG3XzzTerurpacXFxOv/88+XxeCRJp5xyiqTDd4jt3bv3BHYFgFWiQ10AgMhWXFysKVOmtBlPTk7W2LFj9cwzz2jNmjW66aablJaWpt69e+uBBx446sXA9913n3r37q0JEybo66+/VkpKiv74xz/K5XJJkt5//30VFBTooYceUkxMjCZMmKDi4mI5HA51795daWlp+uEPf6iWlhalpaVp6dKl/pr+67/+S0OHDtX555+vlStXnpimALAMFyMDAADb4tQVAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwrf8HfahAa6G7/B8AAAAASUVORK5CYII=" alt="広告費と売上の関係を示す散布図">
  <figcaption>広告費と売上の散布図</figcaption>
</figure>
<p>点が右上がりに並んでいれば、「広告費が大きい期間ほど売上も大きい」という傾向を目でも確認できます。</p>
<p>散布図には、相関係数だけでは気づきにくい次の情報があります。</p>
<ul>
<li>外れた点がないか</li>
<li>点が直線ではなく曲線のように並んでいないか</li>
<li>一部の点だけが相関係数を大きく動かしていないか</li>
</ul>
<p>したがって、<strong><code>corr()</code>で候補を探す → 散布図で実際の形を見る</strong>という順番が実践的です。散布図の色・サイズ・凡例などは、<a href="https://pythondatalab.com/matplotlib-scatter-colormap-size/">Matplotlib scatter入門</a>で詳しく解説しています。この記事ではcorr()の結果を確かめるための最小限の描画にとどめます。</p>
<h2><span id="toc16">データ分析では「確認→相関→可視化」の流れで使う</span></h2>
<p>実際の分析では、いきなり<code>corr()</code>だけを実行するより、次の順番で進めると迷いにくくなります。</p>
<ol>
<li><code>head()</code>や<code>dtypes</code>でDataFrameの中身と型を確認する</li>
<li><code>describe()</code>で各数値列の分布をざっくり確認する</li>
<li>必要なら文字列の数字や欠損値を整える</li>
<li><code>corr()</code>で列同士の相関を一覧する</li>
<li>気になる組み合わせを散布図で確認する</li>
</ol>
<p>つまり、<code>corr()</code>は前処理そのものではなく、<strong>整えたDataFrameを探索し、次に詳しく見るべき関係を見つける段階</strong>に位置づきます。</p>
<p>この流れを意識すると、<code>df.corr()</code>で表を出して終わるのではなく、分析の次の一手を決められるようになります。</p>
<h2><span id="toc17">注意：相関が高くても因果関係があるとは限らない</span></h2>
<p>相関係数を読むときに、最も大切な注意点の1つです。</p>
<p>たとえば、このサンプルでは<code>広告費</code>と<code>売上</code>に強い正の相関があります。しかし、この結果だけから**「広告費を増やしたことが売上増加の原因である」**とは断定できません。季節、キャンペーン、来店客数など、別の要因が両方に影響している可能性もあります。</p>
<p><code>corr()</code>が示すのは、あくまでデータ上の関係です。<strong>相関関係と因果関係は別物</strong>として扱いましょう。</p>
<h2><span id="toc18">まとめ：corr()で関係を見つけ、散布図で確かめよう</span></h2>
<p>この記事では、Pandasの<code>corr()</code>を使って相関係数・相関行列を確認する方法を解説しました。</p>
<ul>
<li><code>corr()</code>は<strong>列と列の関係を数値でまとめて確認する</strong>メソッド</li>
<li>相関係数は-1〜1で、<strong>符号は向き、絶対値は直線的な関係の強さを見る手がかり</strong></li>
<li>相関行列では、同じ列同士の対角線より<strong>異なる列同士</strong>を見る</li>
<li>標準のPearsonを基本にし、必要に応じてSpearman・Kendallを検討する</li>
<li>文字列型や欠損値がある場合は、計算前にデータを確認する</li>
<li>相関係数だけでは点の散らばりや外れ値が見えないため、<strong>散布図も組み合わせる</strong></li>
<li>強い相関があっても、因果関係があるとは限らない</li>
</ul>
<p>初心者のうちは、<strong><code>describe()</code>で各列を確認 → <code>corr()</code>で列同士の関係を探す → scatterで形を確認</strong>という流れを覚えておくと、データ分析を一段進めやすくなります。</p>
<h2><span id="toc19">関連記事</span></h2>
<ul>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方・基本操作をわかりやすく解説</a></li>
<li><a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方｜統計量の意味・include=&#8217;all&#8217;・info()との違いを解説</a></li>
<li><a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方｜データ型で列を選ぶ方法を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</a></li>
<li><a href="https://pythondatalab.com/matplotlib-scatter-colormap-size/">Matplotlib scatter入門：色とサイズで散布図を可視化する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-isnull/">欠損値を可視化して攻略！Pandas isnullとヒートマップ活用術</a></li>
</ul>

</div>
<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<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 id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1786266416385" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">pandas corr()とは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>corr()</code>は、DataFrameやSeriesの数値データについて相関係数を計算するためのメソッドです。DataFrameに使うと、複数の列同士の相関係数をまとめた相関行列を作れます。</p>

</div>
</div>
<div id="faq-question-1786266458063" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">相関係数が1、-1、0に近い場合はどういう意味ですか？</span></h3>
<div class="rank-math-answer ">

<p>1に近いほど強い正の相関、-1に近いほど強い負の相関を示します。0付近なら、少なくとも強い直線的な相関は見られません。ただし、0に近いからといって「あらゆる関係がない」とは断定できません。</p>

</div>
</div>
<div id="faq-question-1786266475868" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">corr()で文字列列がある場合はどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p>まず<code>dtypes</code>で型を確認してください。数値に見える文字列は必要に応じて<code>to_numeric()</code>で数値型へ変換します。分析対象を数値列に限定したい場合は、<code>select_dtypes(include="number")</code>で選択してから<code>corr()</code>を使う方法が分かりやすいです。<code>numeric_only=True</code>を指定する方法もあります。</p>

</div>
</div>
<div id="faq-question-1786266491723" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">corr()でNaNが出るのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>すべて同じ値の列など、相関係数を計算できない場合は<code>NaN</code>になることがあります。欠損値が多く、2列の組み合わせで利用できるデータが十分にないケースにも注意してください。</p>

</div>
</div>
<div id="faq-question-1786266505481" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">PearsonとSpearmanはどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p>通常の数値について直線的な関係を見るなら、まず標準のPearsonが基本です。値そのものより順位関係・単調な関係を重視したい場合にはSpearmanが候補になります。Kendallも順位にもとづく方法ですが、この記事では統計理論の詳細には深入りしません。</p>

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

<p><code>DataFrame.corr()</code>は複数列の組み合わせをまとめて相関行列にします。2つのSeriesだけの相関係数が欲しい場合は、たとえば<code>df["広告費"].corr(df["売上"])</code>のように<code>Series.corr()</code>を使えます。複数列を探索するならDataFrame、特定の2列だけならSeriesと考えると分かりやすいです。</p>

</div>
</div>
<div id="faq-question-1786266532063" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">corr()と散布図はどちらを使えばよいですか？</span></h3>
<div class="rank-math-answer ">

<p>どちらか一方ではなく、組み合わせるのがおすすめです。まず<code>corr()</code>で複数列から気になる組み合わせを見つけ、次に散布図で点の散らばり・外れ値・曲線的な関係を確認します。</p>

</div>
</div>
<div id="faq-question-1786266544159" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">相関係数が高ければ因果関係があると言えますか？</span></h3>
<div class="rank-math-answer ">

<p>言えません。強い相関があっても、別の要因が両方に影響している可能性があります。<code>corr()</code>の結果だけから原因と結果を決めないようにしましょう。</p>

</div>
</div>
<div id="faq-question-1786266557379" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">pandasの相関行列はヒートマップにしたほうがよいですか？</span></h3>
<div class="rank-math-answer ">

<p>列数が少なければ、まず<code>corr()</code>の表を読めれば十分です。列数が多い場合はヒートマップで色分けすると全体を見やすくできますが、高度な装飾はこの記事の範囲外です。なお、通常の数値列の相関ヒートマップと、missingnoで見る欠損パターンの相関ヒートマップは目的が異なります。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-corr/">pandas corr()の使い方｜相関係数・相関行列を初心者向けに解説</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-corr/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>


<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>


<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 between()の使い方｜数値・日付を範囲で抽出する方法</title>
		<link>https://pythondatalab.com/pandas-between/</link>
					<comments>https://pythondatalab.com/pandas-between/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 09 May 2026 15:40:35 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2068</guid>

					<description><![CDATA[<p>pandasのbetween()で数値や日付を範囲抽出する方法を初心者向けに解説。判定から行抽出までの流れ、inclusive、欠損値、query()やcut()との違いも整理します。</p>
<p>パーマリンク案</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-between/">pandas between()の使い方｜数値・日付を範囲で抽出する方法</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 code[class*="language-"] {
    white-space: pre;
  }
  .colab-article .wp-block-table {
    margin: 0.8em 0;
  }
  .colab-article .wp-block-table th,
  .colab-article .wp-block-table td {
    vertical-align: top;
  }
  .colab-figure {
    margin: 1em 0;
  }
  .colab-figure img {
    max-width: 100%;
    height: auto;
  }
</style>

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


<p>CSVを読み込んだあと、DataFrameの中から <strong>「一定の範囲に入る行だけ」</strong> を取り出したいことがあります。</p>
<p>たとえば、次のような場面です。</p>
<ul>
<li>売上が1000円〜5000円の商品だけ見たい</li>
<li>2026年1月の注文だけ確認したい</li>
<li>年齢が20歳〜40歳の人だけ抽出したい</li>
</ul>
<p>このような <strong>数値や日付の範囲で行を絞り込む処理</strong> に使えるのが、Pandasの <code>between()</code> です。</p>
<p><code>between()</code> を使うと、たとえば「売上が1000円以上5000円以下の行」を、次のように短く書けます。</p>
<p><code>df[df["売上"].between(1000, 5000)]</code></p>
<p>つまり、<code>between()</code> は <strong>1つの列を「下限〜上限」の範囲で抽出したいときに使う方法</strong> です。</p>
<p>この記事では、<code>between()</code> を使って、数値や日付の範囲で行を抽出する方法を、サンプルデータで順番に確認します。あわせて、範囲の始まりと終わりを含めるかどうか、<code>between()</code> と同じ範囲抽出を、<code>&gt;=</code>・<code>&lt;=</code> や <code>query()</code> で書く方法も確認します。</p>
<p>また、範囲に関係する処理として <code>cut()</code> もあります。ただし、<code>cut()</code> は <code>between()</code> と同じ結果を出すための方法ではありません。<code>between()</code> は「範囲に入る行を抽出する」処理、<code>cut()</code> は「値を区間に分ける」処理です。この違いは、本文後半で具体例を使って確認します。</p>

<h2><span id="toc1">この記事でわかること</span></h2>
<p>この記事では、次の内容を順番に確認します。</p>
<ul>
<li><code>between()</code> とは何か、範囲抽出の基本</li>
<li>数値を範囲で抽出する方法</li>
<li>日付を範囲で抽出する方法</li>
<li><code>inclusive</code> で数値や日付の範囲の境界値を含める・含めない設定</li>
<li><code>between()</code> と <code>&gt;=</code>・<code>&lt;=</code>・<code>query()</code>・<code>cut()</code> の違い</li>
<li>範囲抽出後に集計・可視化へつなげる考え方</li>
</ul>

<h2><span id="toc2">やりたいこと別：between()を使う場面</span></h2>
<p><code>between()</code> は、<strong>1つの列を「下限〜上限」の範囲で絞りたいとき</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; border: 1px solid #ddd;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使う方法</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">例</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>between()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上1000円〜5000円</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>between()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026年1月の注文</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>query()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>&gt;=</code>・<code>&lt;=</code> や <code>query()</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>cut()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上を低価格・中価格・高価格に分類</td>
</tr>
</tbody>
</table>
<p><code>between()</code> は、連続した範囲で行を絞り込むときに向いています。</p>
<p>候補リストから選ぶ場合や、文字列を含む行を探す場合は、後半の「between()を使わない場面」で軽く整理します。</p>

<h2><span id="toc3">サンプルデータを用意する</span></h2>
<p>ここでは、ECサイトの注文データを例にします。</p>
<p><code>売上</code> と <code>注文日</code> を使って、数値と日付の範囲抽出を確認していきます。</p>

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

data = {
    &quot;注文日&quot;: [&quot;2026-01-03&quot;, &quot;2026-01-08&quot;, &quot;2026-01-15&quot;, &quot;2026-01-28&quot;, &quot;2026-02-04&quot;, &quot;2026-02-12&quot;, &quot;日付不明&quot;],
    &quot;商品&quot;: [&quot;ノートPC&quot;, &quot;マウス&quot;, &quot;キーボード&quot;, &quot;USBメモリ&quot;, &quot;モニター&quot;, &quot;Webカメラ&quot;, &quot;ケーブル&quot;],
    &quot;カテゴリ&quot;: [&quot;PC&quot;, &quot;周辺機器&quot;, &quot;周辺機器&quot;, &quot;周辺機器&quot;, &quot;PC&quot;, &quot;周辺機器&quot;, &quot;周辺機器&quot;],
    &quot;売上&quot;: [120000, 1000, 4800, 980, 5000, None, 3200]
}

df = pd.DataFrame(data)
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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</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;">2026-01-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">ノートPC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.0</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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-01-28</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</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;">980.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">2026-02-12</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">Webカメラ</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;">NaN</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;">ケーブル</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p>この時点では、<code>注文日</code> は文字列として入っています。日付の範囲抽出をするときは、あとで <code>pd.to_datetime()</code> を使って日付型に変換します。</p>

<h2><span id="toc4">数値を範囲で抽出する方法</span></h2>
<p>ここからは、<code>売上</code> 列を使って <code>between()</code> の動きを確認します。</p>
<p><code>between()</code> は、いきなり行を取り出すのではなく、まず各行が範囲内かどうかを判定します。</p>

<h3><span id="toc5">まずbetween()で範囲内かどうかを判定する</span></h3>
<p><code>between()</code> は、最初に各行の値が指定した範囲に入っているかどうかを、<code>True</code> / <code>False</code> で判定します。</p>
<p>たとえば、<code>売上</code> が1000円以上5000円以下かどうかを判定してみます。</p>

<pre class="line-numbers"><code class="language-python">df[&quot;売上&quot;].between(1000, 5000)
</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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</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;">False</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;">True</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;">True</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;">False</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;">True</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;">False</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;">True</td>
    </tr>
  </tbody>
</table>

<p><code>True</code> は範囲内、<code>False</code> は範囲外という意味です。</p>
<p>この判定結果を使うと、次のステップで <code>True</code> の行だけを抽出できます。</p>

<h3><span id="toc6">判定結果を使って行を抽出する</span></h3>
<p>範囲内かどうかを判定できたら、その条件を <code>df[...]</code> に入れます。</p>
<p>これで、<code>売上</code> が1000円以上5000円以下の行だけを抽出できます。</p>

<pre class="line-numbers"><code class="language-python">売上範囲内 = df[df[&quot;売上&quot;].between(1000, 5000)]
売上範囲内
</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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">ケーブル</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p>このコードでは、<code>売上</code> が1000円以上5000円以下の行だけが残ります。</p>
<p>ポイントは、<strong>1000円ちょうどの行も、5000円ちょうどの行も含まれる</strong>ことです。<code>between()</code> は、初期設定では両端の値を含みます。</p>

<p><code>between()</code> は、売上だけでなく、年齢・点数・価格など、範囲で絞りたい数値列にも同じように使えます。</p>

<h2><span id="toc7">日付を範囲で抽出する方法</span></h2>
<p><code>between()</code> は、数値だけでなく日付にも使えます。</p>
<p>ただし、CSVから読み込んだ日付列は、文字列のままになっていることがあります。日付の範囲抽出をする前に、<code>pd.to_datetime()</code> で日付型に変換しておきます。</p>

<pre class="line-numbers"><code class="language-python">df[&quot;注文日&quot;] = pd.to_datetime(df[&quot;注文日&quot;], errors=&quot;coerce&quot;)
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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</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;">2026-01-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">ノートPC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.0</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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-01-28</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</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;">980.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">2026-02-12</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">Webカメラ</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;">NaN</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;">NaT</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p>このセルを実行すると、<code>df["注文日"]</code> は日付型に変換されます。</p>
<p>そのため、以降の <code>df</code> では、日付として変換できなかった <code>"日付不明"</code> は <code>NaT</code> と表示されます。</p>

<p><code>errors="coerce"</code> を指定すると、日付に変換できない値は <code>NaT</code> に変わります。</p>
<p>今回のデータでは、<code>"日付不明"</code> は日付として変換できません。<code>errors="coerce"</code> を指定しないとエラーになりますが、指定しておけば <code>NaT</code> に変換され、処理を続けられます。</p>
<p>次に、2026年1月1日から2026年1月31日までの注文だけを抽出します。</p>

<pre class="line-numbers"><code class="language-python">開始日 = pd.to_datetime(&quot;2026-01-01&quot;)
終了日 = pd.to_datetime(&quot;2026-01-31&quot;)

一月注文 = df[df[&quot;注文日&quot;].between(開始日, 終了日)]
一月注文
</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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</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;">2026-01-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">ノートPC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.0</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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-01-28</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</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;">980.0</td>
    </tr>
  </tbody>
</table>

<p>このように、<code>between()</code> を使うと、指定期間内の日付データだけを取り出せます。</p>
<p>日付の範囲抽出では、次の流れを意識すると安全です。</p>
<ol>
<li><code>pd.to_datetime()</code> で日付型に変換する</li>
<li>開始日と終了日を決める</li>
<li><code>between(開始日, 終了日)</code> で抽出する</li>
</ol>
<p>日付変換そのものを詳しく確認したい場合は、関連記事の <code>to_datetime()</code> を読むと理解しやすくなります。</p>

<p>抽出した結果は、必要な列だけ表示して確認すると見やすくなります。</p>

<pre class="line-numbers"><code class="language-python">一月注文[[&quot;注文日&quot;, &quot;商品&quot;, &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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</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;">2026-01-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">ノートPC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.0</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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-01-28</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">980.0</td>
    </tr>
  </tbody>
</table>

<p>指定した日付範囲に入る行だけが残っていることを確認できます。</p>

<h2><span id="toc8">inclusiveで数値や日付の範囲の境界値を含める・含めない設定</span></h2>
<p><code>between()</code> は、境界値を含めるかどうかを <code>inclusive</code> で指定できます。</p>
<p>たとえば、1000円以上5000円以下なのか、1000円より大きく5000円未満なのかで、結果が変わります。</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; border: 1px solid #ddd;">書き方</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">意味</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">境界値1000</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">境界値5000</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>inclusive="both"</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>inclusive="left"</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>inclusive="right"</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>inclusive="neither"</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>
<p>まずは、初期設定と同じ <code>inclusive="both"</code> を確認します。</p>

<pre class="line-numbers"><code class="language-python">df[df[&quot;売上&quot;].between(1000, 5000, inclusive=&quot;both&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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">NaT</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p>1000円ちょうど、5000円ちょうどの行がどちらも含まれます。</p>
<p>次に、両端を含めない <code>inclusive="neither"</code> を見てみましょう。</p>

<pre class="line-numbers"><code class="language-python">df[df[&quot;売上&quot;].between(1000, 5000, inclusive=&quot;neither&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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <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;">2026-01-15</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;">4800.0</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;">NaT</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p>この場合は、1000円ちょうどと5000円ちょうどの行は含まれません。</p>
<p>初心者がつまずきやすいのは、<strong>境界値を含むと思っていたのに含まれていない、またはその逆</strong>です。抽出条件を書くときは、「以上・以下」なのか「より大きい・未満」なのかを先に決めておきましょう。</p>

<h2><span id="toc9">範囲抽出で欠損値があるときの注意点</span></h2>
<p>ここまでで、数値と日付の範囲抽出を確認しました。</p>
<p>次に、抽出対象の列に欠損値がある場合の動きを確認します。</p>
<p><code>between()</code> では、<code>NaN</code> や日付型の欠損値は範囲内として扱われません。</p>
<p>実際に、<code>売上</code> が欠損している行がどう判定されるか確認してみましょう。</p>

<p>ここでは、欠損値がどのように判定されるかを見やすくするために、<code>商品</code>・<code>売上</code>・<code>範囲内</code> だけを並べた確認用のDataFrameを作ります。</p>
<p>元の <code>df</code> を変更しているわけではなく、判定結果を確認するための表です。</p>

<pre class="line-numbers"><code class="language-python">pd.DataFrame({
    &quot;商品&quot;: df[&quot;商品&quot;],
    &quot;売上&quot;: df[&quot;売上&quot;],
    &quot;範囲内&quot;: df[&quot;売上&quot;].between(1000, 5000)
})
</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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">範囲内</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;">ノートPC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</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;">1000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">4800.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">USBメモリ</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">980.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</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;">5000.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">Webカメラ</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</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;">3200.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</td>
    </tr>
  </tbody>
</table>

<p><code>売上</code> が欠損している行は、<code>範囲内</code> が <code>False</code> になります。</p>
<p>欠損値は、1000以上とも5000以下とも判断できないためです。欠損値をどう扱うかは、分析目的によって変わります。</p>

<h2><span id="toc10">between()と&gt;=・&lt;=・query()・cut()の違い</span></h2>
<p><code>between()</code> と似た処理は、比較演算子や <code>query()</code> でも書けます。また、範囲に関係するメソッドとして <code>cut()</code> もあります。</p>
<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; border: 1px solid #ddd;">比較対象</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使う場面</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>between()</code>との違い</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>&gt;=</code>・<code>&lt;=</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>between()</code>のほうが範囲抽出の意図が読みやすい</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>query()</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>cut()</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>between()</code>は範囲に入る行を抽出、<code>cut()</code>は値を区間に分類</td>
</tr>
</tbody>
</table>
<p>同じ範囲条件を、<code>between()</code> と比較演算子で比べてみましょう。</p>

<pre class="line-numbers"><code class="language-python"># between()を使う書き方
df[df[&quot;売上&quot;].between(1000, 5000)]
</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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">NaT</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<pre class="line-numbers"><code class="language-python"># 比較演算子を使う書き方
df[(df[&quot;売上&quot;] &gt;= 1000) &amp; (df[&quot;売上&quot;] &lt;= 5000)]
</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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">NaT</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p>1つの列を範囲で絞るだけなら、<code>between()</code> のほうが読みやすいことが多いです。</p>
<p>一方で、「売上が5000円以上」「カテゴリが周辺機器」「注文日が1月以降」のように複数条件を組み合わせる場合は、通常の条件式や <code>query()</code> も選択肢になります。</p>

<h3><span id="toc11">query()で書く場合</span></h3>
<p>同じ条件を <code>query()</code> で書くと、次のようになります。</p>

<pre class="line-numbers"><code class="language-python">df.query(&quot;1000 &lt;= 売上 &lt;= 5000&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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">NaT</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p><code>query()</code> は便利ですが、列名や文字列条件の書き方に慣れが必要です。</p>
<p>この記事では、まず <strong>1つの列を範囲で絞るなら <code>between()</code></strong> と覚えるのがおすすめです。</p>

<h3><span id="toc12">cut()は抽出ではなく分類に使う</span></h3>
<p><code>between()</code> と <code>cut()</code> は、どちらも「範囲」に関係しますが、役割は違います。</p>
<p><code>between()</code> は、範囲に合う行を残すための方法です。</p>

<pre class="line-numbers"><code class="language-python">df[df[&quot;売上&quot;].between(1000, 5000)]
</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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">カテゴリ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <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;">2026-01-08</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;">1000.0</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;">2026-01-15</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;">4800.0</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;">2026-02-04</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">NaT</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;">3200.0</td>
    </tr>
  </tbody>
</table>

<p>一方で、<code>cut()</code> は値を区間ごとのラベルに分けたいときに使います。ここでは違いを確認するために、軽く例だけ示します。</p>

<pre class="line-numbers"><code class="language-python">df[&quot;売上帯&quot;] = pd.cut(
    df[&quot;売上&quot;],
    bins=[0, 1000, 5000, 200000],
    labels=[&quot;低め&quot;, &quot;中くらい&quot;, &quot;高め&quot;]
)

df[[&quot;商品&quot;, &quot;売上&quot;, &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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上帯</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;">ノートPC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.0</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;">マウス</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1000.0</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;">キーボード</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4800.0</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;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">980.0</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;">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;">5000.0</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;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">Webカメラ</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">NaN</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;">3200.0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">中くらい</td>
    </tr>
  </tbody>
</table>

<p><code>cut()</code> は行を取り出すというより、値をカテゴリに分ける処理です。</p>
<p>今回の記事の主役は、あくまで <strong>範囲で行を抽出する <code>between()</code></strong> です。区間分けを詳しく学びたい場合は、<code>cut()</code> の記事に進むとよいです。</p>

<h3><span id="toc13">between()を使わない場面も確認しておく</span></h3>
<p><code>between()</code> は、数値や日付を「下限〜上限」の範囲で絞るときに使います。</p>
<p>一方で、次のような条件では、<code>between()</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; border: 1px solid #ddd;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使う方法</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>isin()</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>str.contains()</code></td>
</tr>
</tbody>
</table>
<p>たとえば、商品名が「マウス」または「キーボード」の行を取り出したい場合は <code>isin()</code>、商品名に「PC」を含む行を探したい場合は <code>str.contains()</code> が向いています。</p>
<p>この記事では <code>between()</code> を中心に扱うため、<code>isin()</code> と <code>str.contains()</code> は詳しく扱いません。必要に応じて関連記事で確認してください。</p>

<h2><span id="toc14">抽出したデータを集計して確認する</span></h2>
<p><code>between()</code> は、抽出して終わりではありません。抽出したデータを集計すると、条件に合うデータの傾向を確認しやすくなります。</p>
<p>データ分析では、必要な行だけを取り出したあとに、件数を数えたり、カテゴリ別に集計したり、グラフにしたりすることが多いです。</p>
<p>ここでは、売上が1000円以上5000円以下の商品だけに絞ったあと、カテゴリ別に件数を数えてみます。</p>

<pre class="line-numbers"><code class="language-python">売上範囲内 = df[df[&quot;売上&quot;].between(1000, 5000)]

売上範囲内[&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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">count</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;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1</td>
    </tr>
  </tbody>
</table>

<p><code>value_counts()</code> を使うと、抽出後のデータにどのカテゴリが多いかを確認できます。</p>
<p>次に、カテゴリ別の売上合計も確認してみます。</p>

<pre class="line-numbers"><code class="language-python">売上範囲内.groupby(&quot;カテゴリ&quot;)[&quot;売上&quot;].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; border: 1px solid #ddd;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">PC</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5000.0</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;">9000.0</td>
    </tr>
  </tbody>
</table>

<p>この流れは、実務でもよく使います。</p>
<p><strong>CSV読み込み → 型確認 → 必要な範囲で抽出 → 集計 → 可視化</strong> という流れの中で、<code>between()</code> は「必要な行だけを取り出す」ための前処理として使えます。</p>

<h3><span id="toc15">必要に応じてグラフで確認する</span></h3>
<p>集計結果は、必要に応じてグラフで確認できます。</p>
<p>本格的なグラフ調整はMatplotlibの記事で扱うため、ここでは「抽出後のデータを可視化につなげられる」ことだけ確認します。</p>

<pre class="line-numbers"><code class="language-python">!pip install japanize-matplotlib &gt; /dev/null

import matplotlib.pyplot as plt
import japanize_matplotlib

集計結果 = 売上範囲内.groupby(&quot;カテゴリ&quot;)[&quot;売上&quot;].sum()

集計結果.plot(kind=&quot;bar&quot;)
plt.title(&quot;カテゴリ別の売上合計&quot;)
plt.xlabel(&quot;カテゴリ&quot;)
plt.ylabel(&quot;売上&quot;)
plt.show()
</code></pre>
<figure class="colab-figure">
  <img decoding="async" src="images/figure1.png" alt="between()で抽出したデータをカテゴリ別に集計した棒グラフ">
  <figcaption>between()で抽出したデータをカテゴリ別に集計した棒グラフ</figcaption>
</figure>

<p><code>between()</code> で絞り込んだあとに集計・可視化すると、必要な範囲だけに注目してデータを見やすくなります。</p>
<p>たとえば、全体では高額商品の影響が大きすぎる場合でも、1000〜5000円の商品だけに絞ることで、中価格帯の商品傾向を確認しやすくなります。</p>

<h2><span id="toc16">よくあるミスと確認ポイント</span></h2>
<p><code>between()</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; border: 1px solid #ddd;">よくあるミス</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">原因</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">対策</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;"><code>pd.to_numeric()</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;">日付型ではなく文字列のまま</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"><code>pd.to_datetime()</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>inclusive</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>NaN</code> や <code>NaT</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;">複数条件をすべてbetween()で書こうとする</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;">複数条件では AND/OR や <code>query()</code> も使う</td>
</tr>
</tbody>
</table>
<p>数値の範囲抽出では、必要に応じて先に数値型へ変換します。</p>

<p>数値の範囲抽出では、列が文字列になっている場合に <code>pd.to_numeric()</code> で数値型へ変換します。</p>
<p>日付の範囲抽出では、<code>pd.to_datetime()</code> で日付型へ変換してから <code>between()</code> を使います。</p>

<p><code>between()</code> は、基本的に1つの列を下限〜上限で絞るときに使います。</p>
<p>複数列にまたがる複雑な条件を扱う場合は、通常の条件式や <code>query()</code> も候補にしましょう。</p>

<h2><span id="toc17">between()は前処理・抽出で使う</span></h2>
<p><code>between()</code> は、集計や可視化の前に、必要な行だけを取り出すための処理です。</p>
<p>たとえば、次のような流れで使います。</p>
<p><code>CSV読み込み → 型の確認 → 数値・日付の変換 → 範囲抽出 → 集計 → 可視化</code></p>
<p>つまり、<code>between()</code> は、すべてのデータを見る前に、分析したい範囲に絞り込むための前処理として使えます。</p>

<h2><span id="toc18">まとめ：between()は数値・日付の範囲抽出を読みやすくする方法</span></h2>
<p>この記事では、Pandasの <code>between()</code> を使って、数値や日付の範囲で行を抽出する方法を解説しました。</p>
<p>ポイントを整理します。</p>
<ul>
<li><code>between()</code> は、1つの列を下限〜上限で絞りたいときに使う</li>
<li>数値だけでなく、日付の範囲抽出にも使える</li>
<li>初期設定では、両端の境界値を含む</li>
<li>数値や日付の範囲の境界値を含めるかどうかは <code>inclusive</code> で指定できる</li>
<li><code>NaN</code> や <code>NaT</code> は範囲内として扱われない</li>
<li>文字列の数字は <code>to_numeric()</code>、日付文字列は <code>to_datetime()</code> で整えてから使う</li>
<li>候補リストなら <code>isin()</code>、文字列検索なら <code>str.contains()</code>、区間分けなら <code>cut()</code> を使う</li>
<li>抽出後は <code>value_counts()</code> や <code>groupby()</code>、Matplotlib可視化へつなげると分析に活かしやすい</li>
</ul>
<p>まずは、<strong>「1つの列を下限〜上限で抽出したいときは <code>between()</code>」</strong> と覚えておくと、条件式を読みやすく書けるようになります。</p>

<h2><span id="toc19">次に読みたい関連記事</span></h2>
<p>範囲抽出の前後で使いやすい記事をまとめます。</p>
<ul>
<li><p><a href="https://pythondatalab.com/pandas-filtering/">pandas 条件抽出（filtering）入門｜AND/OR・query関数・複数条件の指定方法</a><br/>
条件抽出全体、AND/OR、<code>query()</code> を整理したいときにおすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-loc-iloc/">Pandas locとilocの違い｜行・列の抽出/スライス/条件指定を図解で解説</a><br/>
行・列の指定方法や、条件指定との関係を整理したいときに役立ちます。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-isin/">pandas isinの使い方と仕組み｜リスト・複数条件・not isin・処理速度まで徹底解説</a><br/>
候補リストに含まれる行を抽出したいときに参考になります。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-str-contains/">pandas str.contains()の使い方｜文字列を含む行を抽出・na=Falseも解説</a><br/>
文字列を含む行を抽出したいときに使います。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</a><br/>
文字列の数字を数値に直してから範囲抽出したいときにおすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換とformat・NaT対処を初心者向けに解説</a><br/>
日付の範囲抽出をする前に、日付型への変換を確認したいときに役立ちます。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-dt/">pandas dtの使い方｜日付から年・月・曜日を取り出す方法を初心者向けに解説</a><br/>
日付を抽出したあと、年・月・曜日を取り出して集計したいときにおすすめです。</p>
</li>
<li><p><a href="https://pythondatalab.com/pandas-cut/">pandas cut()の使い方｜bins・labelsで数値を区間分けする方法を解説</a><br/>
範囲で抽出するのではなく、価格帯や年代などに分類したいときに使います。</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-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>
</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>


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

<p><code>between()</code> は、指定した列の値が下限から上限の範囲に入っているかを判定するメソッドです。<br />たとえば、<code>df["売上"].between(1000, 5000)</code> と書くと、<code>売上</code> が1000以上5000以下の行を判定できます。その結果を <code>df[...]</code> に入れると、範囲内の行だけを抽出できます。</p>

</div>
</div>
<div id="faq-question-1778339669209" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">between()は境界値を含みますか？</span></h3>
<div class="rank-math-answer ">

<p>初期設定では、境界値を含みます。<br />つまり、<code>between(1000, 5000)</code> の場合、1000ちょうど、5000ちょうどの値も含まれます。境界値を含めたくない場合は、<code>inclusive="neither"</code> を使います。</p>

</div>
</div>
<div id="faq-question-1778339682929" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">between()で日付の範囲抽出はできますか？</span></h3>
<div class="rank-math-answer ">

<p>できます。<br />ただし、日付列が文字列のままだと期待どおりに扱えないことがあります。日付の範囲抽出をする前に、<code>pd.to_datetime()</code> で日付型に変換してから <code>between()</code> を使うのがおすすめです。</p>

</div>
</div>
<div id="faq-question-1778339696641" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">between()と&gt;=・&lt;=は何が違いますか？</span></h3>
<div class="rank-math-answer ">

<p>どちらも範囲抽出に使えます。<br /><code>between()</code> は、1つの列を下限〜上限で絞るときに短く読みやすく書けます。<br />一方、<code>&gt;=</code> や <code>&lt;=</code> は、片側だけの条件や複数条件を細かく組み合わせたいときに便利です。</p>

</div>
</div>
<div id="faq-question-1778339707569" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">between()とquery()はどちらを使えばよいですか？</span></h3>
<div class="rank-math-answer ">

<p>1つの列を単純に範囲で絞るなら、まずは <code>between()</code> がわかりやすいです。<br />複数条件を文章に近い形で書きたい場合は、<code>query()</code> も便利です。ただし、<code>query()</code> は列名や文字列条件の書き方に少し慣れが必要です。</p>

</div>
</div>
<div id="faq-question-1778339724225" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">between()とcut()は何が違いますか？</span></h3>
<div class="rank-math-answer ">

<p><code>between()</code> は、範囲に入る行を抽出するために使います。<br />一方、<code>cut()</code> は、数値を「低価格・中価格・高価格」や「20代・30代・40代」のような区間カテゴリに分けるために使います。抽出したいなら <code>between()</code>、分類したいなら <code>cut()</code> と考えるとわかりやすいです。</p>

</div>
</div>
<div id="faq-question-1778339738465" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">範囲抽出で欠損値があるとき、between()はどうなりますか？</span></h3>
<div class="rank-math-answer ">

<p><code>NaN</code> や <code>NaT</code> は、範囲内として扱われません。<br />たとえば、売上が欠損している行や、日付が変換できず <code>NaT</code> になった行は、<code>between()</code> の判定では <code>False</code> になります。</p>

</div>
</div>
<div id="faq-question-1778339757137" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">文字列の数字にbetween()を使ってもよいですか？</span></h3>
<div class="rank-math-answer ">

<p>数値として範囲抽出したい場合は、文字列のまま使わないほうが安全です。<br />CSVから読み込んだデータでは、数字に見えても文字列になっていることがあります。<code>pd.to_numeric()</code> で数値型に変換してから <code>between()</code> を使うと、意図した範囲抽出になりやすいです。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-between/">pandas between()の使い方｜数値・日付を範囲で抽出する方法</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-between/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas select_dtypes()の使い方｜データ型で列を選ぶ方法を初心者向けに解説</title>
		<link>https://pythondatalab.com/pandas-select-dtypes/</link>
					<comments>https://pythondatalab.com/pandas-select-dtypes/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 09 May 2026 08:16:35 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2064</guid>

					<description><![CDATA[<p>pandasのselect_dtypes()を使って、数値列・文字列列・日付列などをデータ型で選ぶ方法を初心者向けに解説します。dtypesで型を確認し、to_numeric()やto_datetime()で型を整えてから、必要な列だけを抽出する流れまでわかります。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方｜データ型で列を選ぶ方法を初心者向けに解説</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 .wp-block-table {
    margin: 0.8em 0;
    width: auto;
    border-collapse: collapse;
  }
  .colab-article .wp-block-table th,
  .colab-article .wp-block-table td {
    border: 1px solid #ddd;
  }
  .colab-article .colab-output {
    margin: 0 !important;
    padding: 1em;
    overflow-x: auto;
    background: #f7f7f7;
  }
  .colab-article .colab-figure img {
    max-width: 100%;
    height: auto;
  }
</style>


<p>CSVやExcelを読み込むと、DataFrameにはいろいろな種類の列が混ざっていることがあります。</p>
<p>たとえば、次のような列です。</p>
<ul>
<li><code>商品名</code> や <code>地域</code> のような文字列の列</li>
<li><code>売上</code> や <code>数量</code> のような数値の列</li>
<li><code>注文日</code> のような日付の列</li>
<li><code>キャンペーン対象</code> のような <code>True</code> / <code>False</code> の列</li>
</ul>
<p>このようなデータでは、列の種類によって次に行う処理が変わります。</p>
<p>数値列は平均・合計・統計量の確認に使いやすく、文字列やカテゴリ列は件数集計に使いやすく、日付列は月別・曜日別の分析に使いやすいです。</p>
<p>つまり、<strong>データ型ごとに列を分けておくと、その後の確認・集計・分析に進みやすくなります。</strong></p>
<p>そこで便利なのが、Pandasの <code>select_dtypes()</code> です。</p>
<p><code>select_dtypes()</code> を使うと、列名ではなく <strong>データ型</strong> を基準にして、数値列・文字列が入っている列・日付列などをまとめて選べます。</p>
<p>たとえば、数値列だけを選びたい場合は、次のように書きます。</p>
<pre class="line-numbers"><code class="language-python">df.select_dtypes(include="number")
</code></pre>
<p>この記事では、<code>pandas select_dtypes</code> の基本を、Google Colabでそのまま試せるサンプルデータを使って解説します。</p>


<h2><span id="toc1">この記事でわかること</span></h2>
<p>この記事では、次の内容を学びます。</p>
<ul>
<li><code>select_dtypes()</code> でできること</li>
<li>データ型ごとに列を分けるメリット</li>
<li><code>dtypes</code> や <code>info()</code> で型を確認してから列を選ぶ流れ</li>
<li>数値列だけを選ぶ方法</li>
<li>文字列が入っている列だけを選ぶ方法</li>
<li>日付列だけを選ぶ方法</li>
<li><code>category</code> 型や <code>bool</code> 型も選べること</li>
<li><code>exclude</code> で特定の型を除外する方法</li>
</ul>
<p>この記事のゴールは、<code>select_dtypes()</code> を使って、DataFrameから数値列・文字列が入っている列・日付列をデータ型ごとに選び、その後の確認・集計・分析に進みやすくすることです。</p>


<h2><span id="toc2">まずdtypesで型を確認してからselect_dtypes()を使う</span></h2>
<p><code>select_dtypes()</code> は、Pandasの前処理で <strong>型を確認したあと</strong> に使うと便利です。</p>
<p>いきなり <code>select_dtypes()</code> を使うのではなく、まず <code>df.dtypes</code> や <code>df.info()</code> で、各列がPandas上でどのデータ型として扱われているかを確認します。</p>
<p><code>df.dtypes</code> は、列ごとのデータ型だけを簡単に確認したいときに使います。<br/>
一方、<code>df.info()</code> では、データ型に加えて、行数・欠損していない値の数・メモリ使用量などもまとめて確認できます。</p>
<p>たとえば、次のような流れです。</p>
<ol>
<li>CSVやExcelを読み込む</li>
<li><code>head()</code> でデータの中身を確認する</li>
<li><code>df.dtypes</code> や <code>df.info()</code> で列ごとのデータ型を確認する</li>
<li>数字や日付に見える列が、Pandas上でどの型として扱われているか確認する</li>
<li>必要に応じて <code>to_numeric()</code>、<code>to_datetime()</code>、<code>astype()</code> で型を整える</li>
<li><code>select_dtypes()</code> で、数値列・文字列が入っている列・日付列などをまとめて選ぶ</li>
</ol>
<p>この流れにすると、「見た目は数字でも、Pandas上では文字列として扱われている」「日付に見えても、まだ日付型ではない」といった状態に気づきやすくなります。</p>
<p>上で確認したように、<code>select_dtypes()</code> のメリットは、データ型ごとに列を分けられることです。</p>
<p>数値列、文字列が入っている列、日付列では、次に行う処理が異なります。<br/>
そのため、先に <code>select_dtypes()</code> で列を種類ごとに整理しておくと、確認・集計・分析へ進みやすくなります。</p>
<p>ただし、型が違う列を混ぜたまま、同じ方法で集計・可視化できるわけではありません。<br/>
数値列なら統計量の確認、文字列やカテゴリ列なら件数集計、日付列なら月別・曜日別の分析のように、列の種類に合った処理を選ぶことが大切です。</p>
<p>この流れで出てくる基本操作が不安な場合は、以下の記事も参考になります。<code>dtypes</code> や <code>info()</code> による型の確認方法は、info()・describe()の記事で解説しています。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方・基本操作をわかりやすく解説</a></li>
<li><a href="https://pythondatalab.com/pandas-head/">pandas head()の使い方｜先頭行を確認してデータの中身を把握する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-info-describe/">Pandas info()とdescribe()の違い｜欠損値・型・統計量の見方を例で解説</a></li>
<li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</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-astype/">pandas astype()の使い方｜文字列・数値への型変換とエラー対処を初心者向けに解説</a></li>
</ul>


<h2><span id="toc3">select_dtypes()とは？</span></h2>
<p><code>select_dtypes()</code> は、DataFrameの列を <strong>データ型（dtype）で選ぶ</strong> メソッドです。</p>
<p><code>dtype</code> は、Pandasで使われる「データ型」を表す言葉です。この記事では、基本的には「データ型」として説明します。</p>
<p>基本形は次のとおりです。</p>
<pre class="line-numbers"><code class="language-python">df.select_dtypes(include=選びたい型)
</code></pre>
<p>または、特定の型を除外したい場合は次のように書きます。</p>
<pre class="line-numbers"><code class="language-python">df.select_dtypes(exclude=除外したい型)
</code></pre>
<p>まず、初心者が最初に覚えるなら、次の3つで十分です。</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; border: 1px solid #ddd;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">書き方の例</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">使う場面</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>df.select_dtypes(include="number")</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>df.select_dtypes(include=["object", "string"])</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>df.select_dtypes(include="datetime")</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">月別・曜日別の分析の前</td>
</tr>
</tbody>
</table>
<p>ポイントは、<code>select_dtypes()</code> は <strong>型を変換するメソッドではない</strong> ということです。</p>
<p>見た目が数字や日付のように見えても、Pandas上のデータ型が違うと、期待した列として選ばれないことがあります。<br/>
そのため、<code>select_dtypes()</code> を使う前後では、<code>df.dtypes</code> や<code>df.info()</code>でデータ型を確認することが大切です。</p>


<h2><span id="toc4">まずはサンプルデータを作る</span></h2>
<p>今回は、ネットショップの注文データをイメージしたDataFrameを使います。</p>
<p>このデータには、数値・文字列・日付・真偽値が混ざっています。<br/>
実際のCSVやExcelデータでも、このようにいろいろな型の列が混ざっていることがよくあります。</p>


<pre class="line-numbers"><code class="language-python">
import pandas as pd
raw_df = pd.DataFrame({
    &quot;注文ID&quot;: [1001, 1002, 1003, 1004, 1005],
    &quot;商品名&quot;: [&quot;ノートPC&quot;, &quot;マウス&quot;, &quot;キーボード&quot;, &quot;モニター&quot;, &quot;USBメモリ&quot;],
    &quot;地域&quot;: [&quot;東京&quot;, &quot;大阪&quot;, &quot;東京&quot;, &quot;福岡&quot;, &quot;大阪&quot;],
    &quot;売上&quot;: [&quot;120000&quot;, &quot;3000&quot;, &quot;8000&quot;, &quot;35000&quot;, &quot;不明&quot;],
    &quot;数量&quot;: [1, 2, 1, 1, 3],
    &quot;割引率&quot;: [0.10, 0.00, 0.05, 0.15, 0.00],
    &quot;注文日&quot;: [&quot;2026-05-01&quot;, &quot;2026-05-02&quot;, &quot;2026-05-03&quot;, &quot;2026-05-04&quot;, &quot;2026-05-05&quot;],
    &quot;キャンペーン対象&quot;: [True, False, True, True, False],
    &quot;メモ&quot;: [&quot;初回購入&quot;, &quot;リピート&quot;, &quot;法人&quot;, &quot;初回購入&quot;, &quot;リピート&quot;]
})

raw_df
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">地域</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数量</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">割引率</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">キャンペーン対象</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">メモ</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;">1001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">ノートPC</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;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">1002</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;">3000</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;">0.00</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</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;">1003</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;">8000</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;">0.05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1004</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;">35000</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;">0.15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-04</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1005</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</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;">0.00</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">リピート</td>
</tr>
</tbody>
</table>

<p>上のデータでは、<code>売上</code> は数字のように見えます。<br/>
しかし、最後に <code>"不明"</code> という文字が入っているため、この時点では数値列として扱えない可能性があります。</p>
<p>まずは、<code>dtypes</code> で列ごとの型を確認してみましょう。</p>


<pre class="line-numbers"><code class="language-python">
raw_df.dtypes
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">dtype</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文ID</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">int64</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;">object</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;">object</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;">object</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;">int64</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;">float64</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;">object</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;">bool</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;">object</td>
</tr>
</tbody>
</table>

<p><code>dtypes</code> を見ると、列ごとのデータ型を確認できます。<br/>
同じように、<code>info()</code> でも各列のデータ型は <code>Dtype</code> として確認できます。</p>
<p>ここで大切なのは、<strong>見た目が数字かどうかではなく、Pandasがどの型として認識しているか</strong> です。</p>
<p>たとえば、<code>売上</code> は数字に見えますが、<code>"不明"</code> が混ざっているため、数値ではなく <code>object</code> 型として扱われています。</p>
<p>では、この状態で数値列だけを選ぶとどうなるか確認してみましょう。</p>


<h2><span id="toc5">まずは変換前のデータで数値列だけを選んでみる</span></h2>
<p>数値列だけを選びたい場合は、<code>include="number"</code> を指定します。</p>
<p>まずは、型を変換する前の <code>raw_df</code> で数値列だけを選んでみます。</p>


<pre class="line-numbers"><code class="language-python">
raw_df.select_dtypes(include=&quot;number&quot;)
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数量</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">割引率</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;">1001</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;">0.10</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;">1002</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;">0.00</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;">1003</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;">0.05</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;">1004</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;">0.15</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;">1005</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;">0.00</td>
</tr>
</tbody>
</table>

<p>実行結果を見ると、<code>注文ID</code>、<code>数量</code>、<code>割引率</code> は選ばれますが、<code>売上</code> は含まれていません。</p>
<p>理由は、<code>売上</code> がPandas上では数値型ではなく <code>object</code> 型として扱われているためです。<br/>
このように、数字に見える列でも、データ型が文字列系のままだと <code>include="number"</code> では選ばれません。</p>
<p><code>売上</code> を数値列として扱いたい場合は、先に <code>to_numeric()</code> で数値型に変換します。</p>


<h2><span id="toc6">売上を数値型に変換する</span></h2>
<p>ここでは、<code>売上</code> を数値列として扱えるようにします。</p>
<p><code>売上</code> には <code>"不明"</code> が混ざっているため、そのままでは数値型にできません。<br/>
そこで、<code>pd.to_numeric()</code> の <code>errors="coerce"</code> を使い、数値に変換できない値を <code>NaN</code> にします。</p>
<p>数値変換の詳しい使い方は、以下の記事で解説しています。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</a></li>
</ul>


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

df[&quot;売上&quot;] = pd.to_numeric(df[&quot;売上&quot;], errors=&quot;coerce&quot;)

df
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">地域</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数量</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">割引率</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">キャンペーン対象</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">メモ</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;">1001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">ノートPC</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.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;">0.10</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">1002</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;">3000.0</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;">0.00</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</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;">1003</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;">8000.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;">0.05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1004</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;">35000.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;">0.15</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-04</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1005</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</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;">NaN</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;">0.00</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">リピート</td>
</tr>
</tbody>
</table>

<p><code>売上</code> の <code>"不明"</code> は、<code>errors="coerce"</code> によって <code>NaN</code> になりました。<br/>
これは「数値に変換できない値を欠損値として扱う」という意味です。</p>
<p>今回は学習用の例として <code>"不明"</code> を <code>NaN</code> に変換しています。<br/>
実務では、<code>"不明"</code> が本当に欠損値として扱ってよい値なのかを確認してから処理しましょう。</p>
<p>次に、型がどう変わったか確認します。</p>


<pre class="line-numbers"><code class="language-python">
df.dtypes
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">dtype</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文ID</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">int64</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;">object</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;">object</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;">float64</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;">int64</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;">float64</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;">object</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;">bool</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;">object</td>
</tr>
</tbody>
</table>

<p>これで、<code>売上</code> は数値型として扱えるようになりました。</p>
<p>もう一度、<code>select_dtypes(include="number")</code> で数値列だけを選んでみましょう。</p>


<h2><span id="toc7">変換後に数値列だけを選ぶ：include=&#8221;number&#8221;</span></h2>
<p><code>売上</code> を数値型に変換したあとであれば、<code>include="number"</code> で数値列として選ばれるようになります。</p>


<pre class="line-numbers"><code class="language-python">
numeric_df = df.select_dtypes(include=&quot;number&quot;)
numeric_df
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数量</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">割引率</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;">1001</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.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;">0.10</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;">1002</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3000.0</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;">0.00</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;">1003</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">8000.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;">0.05</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;">1004</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">35000.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;">0.15</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;">1005</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">NaN</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;">0.00</td>
</tr>
</tbody>
</table>

<p>この結果では、<code>注文ID</code>、<code>売上</code>、<code>数量</code>、<code>割引率</code> のような数値型の列だけが残ります。</p>
<p>一方で、<code>商品名</code>、<code>地域</code>、<code>注文日</code>、<code>メモ</code> などは数値型ではないため、この結果には含まれません。<br/>
また、<code>キャンペーン対象</code> のような <code>True</code> / <code>False</code> の列はbool型として扱われるため、ここでは数値列とは分けて考えるとわかりやすいです。</p>
<p>ただし、<code>注文ID</code> のようなID列も数値型なので、<code>include="number"</code> で選ばれます。<br/>
ここは初心者が特に注意したいポイントです。</p>
<p><strong>数値型の列として選ばれること</strong> と、<strong>平均・合計などの分析対象として意味があること</strong> は同じではありません。<br/>
たとえば、<code>注文ID</code> は数値型ですが、平均値や合計を出しても分析上の意味は薄いです。</p>
<p>そのため、<code>include="number"</code> で数値列をまとめて選んだあとでも、ID列のように分析対象にしない列は、目的に応じて除外しましょう。</p>


<pre class="line-numbers"><code class="language-python">
numeric_df.describe()
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文ID</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">売上</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">数量</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">割引率</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">count</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">4.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">5.000000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">mean</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1003.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">41500.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1.600000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.060000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">std</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1.581139</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">54187.944539</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.894427</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.065192</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">min</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1001.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3000.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.000000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">25%</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1002.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">6750.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.000000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">50%</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1003.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">21500.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.050000</td>
</tr>
<tr>
<td style="min-width: 3em; 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;">1004.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">56250.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.100000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">max</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">1005.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">120000.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">3.000000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">0.150000</td>
</tr>
</tbody>
</table>

<p><code>describe()</code> を使うと、数値列の件数、平均、最小値、最大値などを確認できます。</p>
<p>より詳しく <code>describe()</code> の見方を確認したい場合は、以下の記事も参考になります。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-info-describe/">Pandas info()とdescribe()の違い｜欠損値・型・統計量の見方を例で解説</a></li>
</ul>


<h2><span id="toc8">文字列が入っている列だけを選ぶ：include=[&#8220;object&#8221;, &#8220;string&#8221;]</span></h2>
<p>文字列が入っている列だけを選びたい場合は、<code>include=["object", "string"]</code> のように指定します。</p>
<p>Pandasでは、文字列が <code>object</code> 型として扱われることもあれば、<code>string</code> 型として扱われることもあります。<br/>
初心者のうちは、厳密な違いまで深入りしすぎず、まずは <strong>文字列っぽい列を選ぶときは object と string を意識する</strong> と覚えておくとよいです。</p>
<p>なお、pandasのバージョンによって、文字列が入っている列のデータ型の表示や選び方が少し変わる場合があります。<br/>
うまく選べないときは、まず <code>df.dtypes</code> で実際のデータ型を確認してください。</p>


<pre class="line-numbers"><code class="language-python">
text_df = df.select_dtypes(include=[&quot;object&quot;, &quot;string&quot;])
text_df
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">地域</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">メモ</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;">ノートPC</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;">2026-05-01</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;">マウス</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;">2026-05-02</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;">キーボード</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;">2026-05-03</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;">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;">福岡</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-04</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;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</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;">2026-05-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">リピート</td>
</tr>
</tbody>
</table>

<p>この例では、<code>商品名</code>、<code>地域</code>、<code>注文日</code>、<code>メモ</code> などが選ばれます。</p>
<p>ここで <code>注文日</code> も選ばれるのは、まだ <code>to_datetime()</code> で日付型に変換していないためです。<br/>
見た目が日付でも、Pandas上で文字列として扱われていれば、文字列系の列として選ばれます。</p>
<p>文字列が入っている列だけを取り出すと、<code>value_counts()</code> で種類ごとの件数を確認しやすくなります。</p>


<h2><span id="toc9">object型を選ぶときの注意</span></h2>
<p>文字列が入っている列を選びたいときは、次のように書けます。</p>
<pre class="line-numbers"><code class="language-python">df.select_dtypes(include=["object", "string"])
</code></pre>
<p>ただし、<code>object</code> 型は「文字列専用の型」ではありません。</p>
<p>CSVやExcelを読み込んだデータでは、商品名・地域名・メモのような文字列列が <code>object</code> 型になることが多いです。<br/>
しかし、<code>object</code> 型には、文字列だけでなく、リストや辞書などのPythonオブジェクトが入ることもあります。</p>
<p>そのため、文字列列だけを正確に扱いたい場合は、まず <code>df.dtypes</code> で型を確認し、必要に応じて <code>astype("string")</code> で文字列型に整えてから使うと安心です。</p>
<pre class="line-numbers"><code class="language-python">df["商品名"] = df["商品名"].astype("string")
</code></pre>
<p><code>select_dtypes()</code> は便利ですが、最初に <code>df.dtypes</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 style="text-align: right;">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">count</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;">2</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>
</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>
</tr>
</tbody>
</table>

<p><code>value_counts()</code> は、カテゴリ名や文字列の出現回数を数えるときに便利です。</p>
<p>たとえば、地域別、商品名別、メモの種類別などを確認したいときに使えます。</p>
<p>詳しくは、以下の記事で解説しています。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</a></li>
</ul>


<h2><span id="toc10">日付列だけを選ぶ：include=&#8221;datetime&#8221;</span></h2>
<p>日付列だけを選びたい場合は、<code>include="datetime"</code> を指定します。</p>
<p>ただし、見た目が日付の文字列でも、Pandas上で日付型になっていなければ選ばれません。<br/>
今回の <code>注文日</code> も、ここまでは文字列のままです。</p>
<p>そのため、日付列として選ぶ前に、<code>to_datetime()</code> で日付型に変換します。<br/>
<code>to_datetime()</code> の詳しい使い方は、以下の記事で解説しています。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換と format・NaT 対処を初心者向けに解説</a></li>
</ul>


<pre class="line-numbers"><code class="language-python">
df[&quot;注文日&quot;] = pd.to_datetime(df[&quot;注文日&quot;])

date_df = df.select_dtypes(include=&quot;datetime&quot;)
date_df
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</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;">2026-05-01</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;">2026-05-02</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;">2026-05-03</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;">2026-05-04</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;">2026-05-05</td>
</tr>
</tbody>
</table>

<p>日付列を選べるようになると、月別集計や曜日別集計などに進みやすくなります。</p>
<p>なお、日付列から年・月・曜日を取り出す方法は、以下の記事で詳しく解説しています。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-dt/">pandas dtの使い方｜日付から年・月・曜日を取り出す方法を初心者向けに解説</a></li>
</ul>


<h2><span id="toc11">補足：category列やbool列も選べる</span></h2>
<p><code>select_dtypes()</code> では、数値列・文字列が入っている列・日付列だけでなく、カテゴリ型や真偽値型の列も選べます。</p>
<p>たとえば、カテゴリ型の列を選ぶ場合は <code>include="category"</code>、<code>True</code> / <code>False</code> のような真偽値列を選ぶ場合は <code>include="bool"</code> を使います。</p>
<p>ただし、初心者のうちは、まず <code>include="number"</code>、<code>include=["object", "string"]</code>、<code>include="datetime"</code> の3つを優先して覚えれば十分です。<br/>
<code>category</code> や <code>bool</code> は、必要になったときに補足として使うくらいで問題ありません。</p>
<p><code>category</code> 型への変換は <code>astype("category")</code> で行えますが、詳しい型変換は以下の記事で解説しています。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-astype/">pandas astype()の使い方｜文字列・数値への型変換とエラー対処を初心者向けに解説</a></li>
</ul>


<h2><span id="toc12">excludeで特定の型を除外する</span></h2>
<p><code>include</code> は「この型を選ぶ」という指定です。<br/>
一方で、<code>exclude</code> は「この型を除外する」という指定です。</p>
<p>たとえば、数値列以外を選びたい場合は、次のように書けます。</p>


<pre class="line-numbers"><code class="language-python">
non_numeric_df = df.select_dtypes(exclude=&quot;number&quot;)
non_numeric_df
</code></pre>

<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;"></th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">商品名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">地域</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">注文日</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">キャンペーン対象</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">メモ</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;">ノートPC</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;">2026-05-01</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">マウス</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;">2026-05-02</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</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;">キーボード</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;">2026-05-03</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">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;">福岡</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">2026-05-04</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">True</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;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">USBメモリ</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;">2026-05-05</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">False</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">リピート</td>
</tr>
</tbody>
</table>

<p><code>exclude="number"</code> を指定すると、数値型の列が除外されます。</p>
<p>ただし、初心者のうちは、まず <code>include</code> を中心に使うのがおすすめです。<br/>
<code>exclude</code> は、慣れてきてから「数値列以外をまとめて確認したい」ときに使うとよいでしょう。</p>


<h2><span id="toc13">select_dtypes()で次の処理に進みやすくする</span></h2>
<p><code>select_dtypes()</code> で列をデータ型ごとに分けておくと、その後の処理に進みやすくなります。</p>
<p>たとえば、数値列は統計量の確認、文字列やカテゴリ列は件数集計、日付列は日付を使った分析に向いています。<br/>
この記事では詳しい集計や可視化には深入りせず、「分析に使う列をデータ型ごとに整理する」ところまでを押さえます。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</a></li>
<li><a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas groupby×aggの使い方｜基本の集計とaggの書き方を例で解説</a></li>
<li><a href="https://pythondatalab.com/matplotlib-hist-boxplot/">Matplotlib ヒストグラム＆箱ひげ図 入門｜bins設定と外れ値の可視化・分析</a></li>
</ul>


<h2><span id="toc14">まとめ</span></h2>
<p>この記事では、<code>pandas select_dtypes</code> の使い方を解説しました。</p>
<p><code>select_dtypes()</code> は、DataFrameの中から <strong>データ型を基準に列を選ぶ</strong> メソッドです。</p>
<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; border: 1px solid #ddd;">やりたいこと</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ddd;">書き方</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>df.select_dtypes(include="number")</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>df.select_dtypes(include=["object", "string"])</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>df.select_dtypes(include="datetime")</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>df.select_dtypes(include="bool")</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>df.select_dtypes(exclude="number")</code></td>
</tr>
</tbody>
</table>
<p><code>category</code> 型の列を選びたい場合は、<code>include="category"</code> も使えます。<br/>
ただし、初心者のうちは、まず数値列・文字列が入っている列・日付列を選べれば十分です。</p>
<p>注意したいのは、<code>select_dtypes()</code> は <strong>型を変換するメソッドではない</strong> という点です。<br/>
数字に見える列や日付に見える列でも、Pandas上のデータ型が違えば選ばれないことがあります。</p>
<p>うまく選べないときは、まず <code>df.dtypes</code> や <code>df.info()</code> で型を確認しましょう。</p>
<p>必要に応じて、数値なら <code>to_numeric()</code>、日付なら <code>to_datetime()</code>、文字列型やカテゴリ型への変換なら <code>astype()</code> で型を整えてから、<code>select_dtypes()</code> を使います。</p>
<p>データ型を確認し、必要に応じて型を整えたうえで <code>select_dtypes()</code> を使うと、列の種類に合った次の処理へ進みやすくなります。</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="toc15"> カテゴリから探す</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-1778312073060" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc16">pandasで数値列だけ抽出するにはどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p>数値列だけ抽出したい場合は、次のように書きます。<br /><code>df.select_dtypes(include="number")</code></p>
<p>数字に見える列でも <code>object</code> 型になっている場合は選ばれないため、必要に応じて <code>to_numeric()</code> で数値型に変換します。</p>

</div>
</div>
<div id="faq-question-1778312089484" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc17">pandasで文字列が入っている列だけ選ぶにはどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p>文字列が入っている列だけを選びたい場合は、次のように書きます。<br /><code>df.select_dtypes(include=["object", "string"])</code></p>
<p>うまく選べないときは、まず <code>df.dtypes</code> で実際のデータ型を確認しましょう。</p>

</div>
</div>
<div id="faq-question-1778312104029" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc18">日付列だけを選ぶことはできますか？</span></h3>
<div class="rank-math-answer ">

<p>できます。日付型の列だけを選ぶ場合は、次のように書きます。<br /><code>df.select_dtypes(include="datetime")</code></p>
<p>見た目が日付でも文字列のままでは選ばれないため、必要に応じて <code>to_datetime()</code> で日付型に変換します。</p>

</div>
</div>
<div id="faq-question-1778312119405" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc19">select_dtypes()で型は変換できますか？</span></h3>
<div class="rank-math-answer ">

<p>できません。<br /><code>select_dtypes()</code> は、データ型を基準に列を選ぶメソッドです。<br />型を変換したい場合は、<code>to_numeric()</code>、<code>to_datetime()</code>、<code>astype()</code> などを使います。</p>

</div>
</div>
<div id="faq-question-1778312140181" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc20">うまく列が選ばれないときは何を確認すればよいですか？</span></h3>
<div class="rank-math-answer ">

<p>まずは、<code>df.dtypes</code> または <code>df.info()</code> でPandas上のデータ型を確認しましょう。<br />数字に見える列が <code>object</code> 型のままだと <code>include="number"</code> では選ばれません。<br />日付に見える列が文字列型のままだと <code>include="datetime"</code> では選ばれません。</p>

</div>
</div>
<div id="faq-question-1778312166309" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">includeとexcludeを同時に使うときの注意はありますか？</span></h3>
<div class="rank-math-answer ">

<p><code>include</code> と <code>exclude</code> は同時に使えます。<br />たとえば、数値列を選びつつ、整数型だけを除外したい場合は次のように書けます。<br /><code>df.select_dtypes(include="number", exclude="int64")</code></p>
<p>ただし、<code>include</code> と <code>exclude</code> に同じ型を指定するとエラーになります。<br /><code>df.select_dtypes(include="number", exclude="number")</code></p>
<p>初心者のうちは、まず <code>include</code> だけで必要な型を選ぶ使い方から覚えるのがおすすめです。<br />慣れてきたら、不要な型を外したい場面で <code>exclude</code> を使うとよいでしょう。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方｜データ型で列を選ぶ方法を初心者向けに解説</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-select-dtypes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas where()・mask()の使い方｜条件に応じて値を残す・置き換える方法</title>
		<link>https://pythondatalab.com/pandas-where-mask/</link>
					<comments>https://pythondatalab.com/pandas-where-mask/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Wed, 06 May 2026 13:48:04 +0000</pubDate>
				<category><![CDATA[Python実行環境・設定]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2060</guid>

					<description><![CDATA[<p>pandasのwhere()・mask()の使い方を初心者向けに解説。条件を満たす値を残す方法、条件に合う値を置き換える方法、where()とmask()の違い、replace()・fillna()・loc・np.where()との使い分けも整理します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-where-mask/">pandas where()・mask()の使い方｜条件に応じて値を残す・置き換える方法</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 href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css" rel="stylesheet"/>
<link href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css" rel="stylesheet"/>
<link href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css" rel="stylesheet"/>
<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;
    background: #2d2d2d;
    color: #ccc;
    overflow-x: auto;
  }
  .colab-article .wp-block-table {
    width: auto;
    border-collapse: collapse;
    margin: 0.8em 0;
    display: table;
  }
  .colab-article .wp-block-table th,
  .colab-article .wp-block-table td {
    border: 1px solid #ddd;
    vertical-align: top;
  }
  .colab-article .colab-output {
    margin: 0 !important;
    padding: 0.8em;
    white-space: pre-wrap;
    background: #f6f8fa;
    border: 1px solid #ddd;
    overflow-x: auto;
  }
  .colab-article .colab-figure img {
    max-width: 100%;
    height: auto;
  }

  .colab-article pre.line-numbers,
  .colab-article pre[class*="language-"] {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
  }
  .colab-article code.language-python {
    white-space: pre;
  }

</style>

<p>Pandasで前処理をしていると、次のような場面で迷うことがあります。</p>
<ul>
<li>60点以上の点数だけ残し、60点未満は欠損値として扱いたい</li>
<li>売上がマイナスになっている不自然な値だけ、0やNaNにしたい</li>
<li>年齢が120歳を超えるような確認が必要な値だけ、欠損値にしたい</li>
<li><code>replace()</code>、<code>loc</code>、<code>where()</code>、<code>mask()</code>のどれを使えばよいかわからない</li>
</ul>
<p>最初に結論を言うと、<strong><code>where()</code>は「条件を満たす値を残す」ために使い、<code>mask()</code>は「条件を満たす値を置き換える」ために使います。</strong></p>
<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;"><code>where()</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>mask()</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>replace()</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>fillna()</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>loc</code></td>
</tr>
</tbody>
</table>
<p>この記事では、Google Colabでそのまま試せる小さなDataFrameを使いながら、<code>where()</code>と<code>mask()</code>の違い、使いどころ、よくあるミスを初心者向けに整理します。</p>
<h2><span id="toc1">この記事でわかること</span></h2>
<p>この記事では、次の内容を学びます。</p>
<ul>
<li><code>where()</code>の基本的な使い方</li>
<li><code>mask()</code>の基本的な使い方</li>
<li><code>where()</code>と<code>mask()</code>の違い</li>
<li>条件に合わない値を<code>NaN</code>にする方法</li>
<li><code>NaN</code>にしたときに整数列が小数表示になる理由</li>
<li>条件に応じて別の値に置き換える方法</li>
<li><code>loc</code>、<code>replace()</code>、<code>fillna()</code>、<code>np.where()</code>との使い分け</li>
<li>初心者が間違えやすい条件式の向き</li>
</ul>
<h2><span id="toc2">Pandas前処理の中での位置づけ</span></h2>
<p><code>where()</code>と<code>mask()</code>は、DataFrameを確認したあとに、<strong>条件に応じて値を整える前処理</strong>で役立ちます。</p>
<p>たとえば、次のような流れです。</p>
<ol>
<li><code>info()</code>や<code>describe()</code>でデータの型・欠損値・統計量を確認する</li>
<li><code>unique()</code>や<code>value_counts()</code>で値の中身を確認する</li>
<li><code>replace()</code>で表記ゆれを直す</li>
<li><code>where()</code>や<code>mask()</code>で条件に合わない値・確認が必要な値を整理する</li>
<li><code>fillna()</code>で欠損値を補う</li>
<li><code>groupby()</code>やグラフで集計・可視化する</li>
</ol>
<p>つまり、<code>where()</code>と<code>mask()</code>は、<strong>集計や可視化の前に、条件に応じて値を整えるための道具</strong>です。</p>
<h2><span id="toc3">where()とmask()の判断基準</span></h2>
<p>まず、<code>where()</code>と<code>mask()</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;"><code>where(条件)</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">条件を満たす値を残す</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上だけ残す</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>mask(条件)</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">条件を満たす値を置き換える</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点未満をNaNにする</td>
</tr>
</tbody>
</table>
<p>特に初心者が混乱しやすいのは、<strong>条件に合う値をどうしたいのか</strong>です。</p>
<ul>
<li>条件に合う値を残したい → <code>where()</code></li>
<li>条件に合う値を消したい・置き換えたい → <code>mask()</code></li>
</ul>
<p>この記事では、まず同じサンプルデータを使って、<code>where()</code>と<code>mask()</code>の動きを確認していきます。</p>
<h2><span id="toc4">サンプルデータを用意する</span></h2>
<p>ここでは、テスト点数、売上、年齢を持つ小さなDataFrameを使います。</p>
<p>売上の<code>-500</code>は、今回の例では「本来はマイナスにならないはずの入力ミス」として扱います。<br/>
年齢の<code>135</code>も、今回の例では「確認が必要な値」として扱います。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd

df = pd.DataFrame({
    "名前": ["田中", "佐藤", "鈴木", "高橋", "伊藤", "山本"],
    "点数": [82, 55, 91, 47, 60, 73],
    "売上": [12000, -500, 18500, 0, 9200, 15000],
    "年齢": [24, 31, 135, 28, 42, 19]
})

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></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;">82</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">12000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">24</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;">55</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">-500</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">31</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;">91</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">18500</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;">3</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">高橋</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">28</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;">60</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">42</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;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">15000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">19</td></tr></tbody></table>
<p>このDataFrameでは、次のような前処理を考えます。</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;">点数</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上だけ残したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点未満を<code>NaN</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>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">負の値を0または<code>NaN</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;">120歳を超える値を確認対象にしたい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120歳超を<code>NaN</code>にする</td>
</tr>
</tbody>
</table>
<p>実務でも、CSVやExcelを読み込んだあとに、このような「条件に応じた値の整理」が必要になることがあります。</p>
<h2><span id="toc5">where()の基本：条件を満たす値を残す</span></h2>
<p><code>where()</code>は、<strong>条件を満たす値を残し、条件を満たさない値を置き換える</strong>メソッドです。</p>
<p>基本形は次のように考えます。</p>
<pre class="line-numbers"><code class="language-python">Series.where(条件, other=置き換える値)
</code></pre>
<p><code>other</code>を指定しない場合、条件を満たさない値は<code>NaN</code>になります。</p>
<pre class="line-numbers"><code class="language-python">Series.where(条件)
</code></pre>
<p>ここでは、点数が60点以上の値だけを残し、60点未満を<code>NaN</code>にしてみます。</p>
<pre class="line-numbers"><code class="language-python">df["点数_where"] = df["点数"].where(df["点数"] &gt;= 60)

df[["名前", "点数", "点数_where"]]</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;">点数_where</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;">82</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82.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;">55</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;">鈴木</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91.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;">高橋</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47</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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60.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;">山本</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73.0</td></tr></tbody></table>
<p>上のコードでは、<code>df["点数"] &gt;= 60</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;">82</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">82</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">55</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点未満</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;">91</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">91</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">47</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点未満</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;">60</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">73</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">73</td>
</tr>
</tbody>
</table>
<p>ここで大切なのは、<code>where()</code>は「条件に合う値を置き換える」のではなく、<strong>条件に合う値を残す</strong>という点です。</p>
<h3><span id="toc6">補足：NaNが入ると小数表示になることがある</span></h3>
<p><code>where()</code>や<code>mask()</code>で<code>NaN</code>を作ると、整数だった列が<code>82.0</code>のように小数で表示されることがあります。</p>
<p>これは、<code>NaN</code>が欠損値を表すため、整数だけの列に<code>NaN</code>が混ざると、Pandasが列全体を小数型として扱うことがあるためです。</p>
<p>そのため、結果が<code>82.0</code>のように表示されても、処理が間違っているとは限りません。まずは、<strong>どの値が残り、どの値が<code>NaN</code>になったか</strong>を確認しましょう。</p>
<h2><span id="toc7">where()で条件に合わない値を別の値に置き換える</span></h2>
<p><code>where()</code>では、<code>other</code>を指定すると、条件を満たさない値を別の値に置き換えられます。</p>
<pre class="line-numbers"><code class="language-python">Series.where(残したい条件, other=条件に合わないときの値)
</code></pre>
<p>ここでは、売上が0以上ならそのまま残し、0未満の売上を0に置き換えます。</p>
<pre class="line-numbers"><code class="language-python">df["売上_where_0"] = df["売上"].where(df["売上"] &gt;= 0, other=0)

df[["名前", "売上", "売上_where_0"]]</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;">売上_where_0</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;">12000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">12000</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;">-500</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;">2</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">鈴木</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">18500</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">18500</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;">0</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;">4</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</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;">15000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">15000</td></tr></tbody></table>
<p>この例では、売上が0以上の値はそのまま残り、<code>-500</code>だけが<code>0</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;">12000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">12000</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">-500</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>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">18500</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">18500</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;">0以上</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;">9200</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">15000</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0以上</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">15000</td>
</tr>
</tbody>
</table>
<p><code>0</code>は今回のデータでは「売上がなかった」という意味のある値として残しています。<br/>
一方、<code>-500</code>は「本来はマイナスにならない想定の売上」として、確認・修正対象にしています。</p>
<h2><span id="toc8">mask()の基本：条件を満たす値を置き換える</span></h2>
<p><code>mask()</code>は、<code>where()</code>とは逆に、<strong>条件を満たす値を置き換える</strong>メソッドです。</p>
<p>基本形は次のように考えます。</p>
<pre class="line-numbers"><code class="language-python">Series.mask(条件, other=置き換える値)
</code></pre>
<p><code>other</code>を指定しない場合、条件を満たす値は<code>NaN</code>になります。</p>
<pre class="line-numbers"><code class="language-python">Series.mask(条件)
</code></pre>
<p>ここでは、年齢が120歳を超える値を確認対象として、<code>NaN</code>にします。</p>
<pre class="line-numbers"><code class="language-python">df["年齢_mask"] = df["年齢"].mask(df["年齢"] &gt; 120)

df[["名前", "年齢", "年齢_mask"]]</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;">年齢_mask</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;">24</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">24.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;">31</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">31.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;">135</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;">高橋</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">28</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">28.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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">42</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">42.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;">山本</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">19</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">19.0</td></tr></tbody></table>
<p>この例では、<code>年齢 &gt; 120</code>という条件を満たす<code>135</code>だけが<code>NaN</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;">24</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120以下</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">24</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">31</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120以下</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">31</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">135</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120超</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;">28</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120以下</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">28</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">42</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120以下</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">42</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">19</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120以下</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">19</td>
</tr>
</tbody>
</table>
<p><code>mask()</code>は、条件に合う値を隠す・置き換えるイメージで使うと理解しやすいです。</p>
<h2><span id="toc9">where()とmask()の違いを同じデータで比較する</span></h2>
<p><code>where()</code>と<code>mask()</code>は、条件の向きを逆にすると同じ結果を作れることがあります。</p>
<p>たとえば、次の2つはどちらも「60点未満をNaNにする」処理です。</p>
<ul>
<li><code>where(df["点数"] &gt;= 60)</code>：60点以上を残す</li>
<li><code>mask(df["点数"] &lt; 60)</code>：60点未満を置き換える</li>
</ul>
<p>同じデータで比較してみましょう。</p>
<pre class="line-numbers"><code class="language-python">compare = pd.DataFrame({
    "名前": df["名前"],
    "元の点数": df["点数"],
    "where_60点以上を残す": df["点数"].where(df["点数"] &gt;= 60),
    "mask_60点未満をNaN": df["点数"].mask(df["点数"] &lt; 60)
})

compare</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;">where_60点以上を残す</th><th style="white-space: nowrap; padding: 0.2em 0.4em;">mask_60点未満をNaN</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;">82</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82.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;">55</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;">鈴木</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91.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;">高橋</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47</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;">4</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60.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;">山本</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73.0</td></tr></tbody></table>
<p>結果を見ると、<code>where()</code>と<code>mask()</code>で同じような結果になっています。</p>
<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>
<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>where(df["点数"] &gt;= 60)</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上なら残す</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">条件を満たさない60点未満がNaN</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>mask(df["点数"] &lt; 60)</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点未満なら置き換える</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">条件を満たす60点未満がNaN</td>
</tr>
</tbody>
</table>
<p>迷ったときは、次のように判断してください。</p>
<ul>
<li><strong>残したい条件</strong>を書きたい → <code>where()</code></li>
<li><strong>置き換えたい条件</strong>を書きたい → <code>mask()</code></li>
</ul>
<h2><span id="toc10">複数条件でwhere()を使う場合</span></h2>
<p><code>where()</code>や<code>mask()</code>では、複数条件も指定できます。</p>
<p>複数条件を書くときは、次の点に注意します。</p>
<ul>
<li>それぞれの条件を<code>()</code>で囲む</li>
<li>AND条件は<code>&amp;</code>でつなぐ</li>
<li>OR条件は<code>|</code>でつなぐ</li>
</ul>
<p>ここでは、点数が60点以上かつ90点以下の値だけを残してみます。</p>
<pre class="line-numbers"><code class="language-python">df["点数_60から90"] = df["点数"].where((df["点数"] &gt;= 60) &amp; (df["点数"] &lt;= 90))

df[["名前", "点数", "点数_60から90"]]</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;">点数_60から90</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;">82</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82.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;">55</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;">鈴木</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91</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;">高橋</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47</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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60.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;">山本</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73.0</td></tr></tbody></table>
<p>この例では、60点以上かつ90点以下の値だけが残ります。<br/>
<code>55</code>や<code>47</code>は60点未満なので<code>NaN</code>になり、<code>91</code>は90点を超えているため<code>NaN</code>になります。</p>
<p>複数条件は便利ですが、初心者のうちは条件式が長くなりやすいです。<br/>
まずは単一条件で<code>where()</code>と<code>mask()</code>の考え方を理解し、そのあと複数条件に進むと分かりやすくなります。</p>
<h2><span id="toc11">補足：DataFrame全体にもwhere()・mask()は使える</span></h2>
<p>ここまでの例では、<code>df["点数"]</code>のように1つの列に対して<code>where()</code>や<code>mask()</code>を使いました。</p>
<p>実は、<code>DataFrame</code>全体に対しても使えます。
ただし、初心者のうちは、まず<strong>1つの列ごとに処理する</strong>ほうが結果を確認しやすいです。</p>
<p>ここでは、数値列だけを取り出して、0以上の値を残し、0未満の値を<code>NaN</code>にしてみます。</p>
<pre class="line-numbers"><code class="language-python">numeric_df = df[["点数", "売上", "年齢"]]

numeric_df.where(numeric_df &gt;= 0)</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;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">12000.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">24</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;">55</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">31</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;">91</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">18500.0</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;">3</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">28</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;">60</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">42</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;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">15000.0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">19</td></tr></tbody></table>
<p>このように、<code>DataFrame.where()</code>を使うと、DataFrame内の各値に対して条件を確認できます。</p>
<p>同じ考え方で、<code>DataFrame.mask()</code>もDataFrame全体に使えます。ただし、初心者のうちは、まず1列ずつ処理して結果を確認するほうが安全です。</p>
<p>ただし、実際の記事や学習では、最初からDataFrame全体に使うよりも、</p>
<pre class="line-numbers"><code class="language-python">df["列名"].where(条件)
</code></pre>
<p>のように、<strong>対象の列を決めてから使う</strong>ほうがミスに気づきやすいです。</p>
<h2><span id="toc12">where()・mask()・replace()・fillna()・locの使い分け</span></h2>
<p><code>where()</code>や<code>mask()</code>で迷う理由は、似たような処理をするメソッドが多いからです。</p>
<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>
<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;"><code>where()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">60点以上だけ残す</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>mask()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">120歳超をNaNにする</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>replace()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>"未入力"</code>を<code>NaN</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>fillna()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>NaN</code>を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;">条件抽出・<code>loc</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">売上が10000以上の行を抽出する</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>loc</code></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;"><code>np.where()</code>、<code>assign()</code>、<code>loc</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">合格・不合格列を作る</td>
</tr>
</tbody>
</table>
<p>この記事では、中心を<code>where()</code>と<code>mask()</code>に絞ります。<br/>
<code>replace()</code>は値そのものの置換、<code>fillna()</code>は欠損値を埋める処理、<code>loc</code>は行・列を指定する処理として分けて考えると整理しやすくなります。</p>
<h2><span id="toc13">locでの条件代入との違い</span></h2>
<p><code>loc</code>を使っても、条件に合う行だけ値を変更できます。</p>
<p>たとえば、売上が0未満の値を0にするなら、次のように書けます。</p>
<pre class="line-numbers"><code class="language-python">df_loc = df.copy()

df_loc.loc[df_loc["売上"] &lt; 0, "売上"] = 0

df_loc[["名前", "売上"]]</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;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">田中</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">12000</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;">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;">18500</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;">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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</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;">15000</td></tr></tbody></table>
<p><code>loc</code>は、<strong>条件に合う行と列を指定して、そこへ直接代入する</strong>イメージです。</p>
<p>一方、<code>where()</code>は「条件を満たす値を残し、それ以外を置き換えた結果を作る」イメージです。</p>
<pre class="line-numbers"><code class="language-python">df_where = df.copy()

df_where["売上"] = df_where["売上"].where(df_where["売上"] &gt;= 0, other=0)

df_where[["名前", "売上"]]</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;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">田中</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">12000</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;">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;">18500</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;">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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</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;">15000</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;"><code>loc</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>where()</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>mask()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">条件を満たす値をまとめて置き換えたい</td>
</tr>
</tbody>
</table>
<p>この記事の主役は<code>where()</code>と<code>mask()</code>なので、<code>loc</code>の詳細は別記事で学ぶのがおすすめです。</p>
<h2><span id="toc14">新しい列として結果を残すと確認しやすい</span></h2>
<p>初心者のうちは、いきなり元の列を上書きするより、<strong>新しい列として結果を残す</strong>ほうが確認しやすいです。</p>
<p>たとえば、売上の元データを残したまま、確認用の列を作ると、処理前後を並べて比較できます。</p>
<pre class="line-numbers"><code class="language-python">df_check = df.copy()

df_check["売上_修正案"] = df_check["売上"].where(df_check["売上"] &gt;= 0, other=0)
df_check["年齢_確認用"] = df_check["年齢"].mask(df_check["年齢"] &gt; 120)

df_check[["名前", "売上", "売上_修正案", "年齢", "年齢_確認用"]]</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;">12000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">12000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">24</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">24.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;">-500</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">31</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">31.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;">18500</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">18500</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">135</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;">高橋</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;">28</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">28.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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">42</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">42.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;">山本</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">15000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">15000</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">19</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">19.0</td></tr></tbody></table>
<p>このように、元の列と処理後の列を並べると、どの値が変わったのかを確認しやすくなります。</p>
<p>特に、公開データや実務データでは、いきなり上書きすると元の状態が分からなくなることがあります。<br/>
最初は新しい列に結果を保存し、問題なければ上書きする流れがおすすめです。</p>
<h2><span id="toc15">よくあるミス1：代入しないと元のDataFrameは変わらない</span></h2>
<p><code>where()</code>や<code>mask()</code>は、実行しただけでは元のDataFrameを自動で書き換えません。</p>
<p>次のコードでは、<code>where()</code>の結果を表示しているだけなので、元の<code>df["売上"]</code>は変わりません。</p>
<pre class="line-numbers"><code class="language-python">df["売上"].where(df["売上"] &gt;= 0, other=0)

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></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;">12000</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;">-500</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;">18500</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;">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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</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;">15000</td></tr></tbody></table>
<p>元のDataFrameを変更したい場合は、次のように代入します。</p>
<pre class="line-numbers"><code class="language-python">df_update = df.copy()

df_update["売上"] = df_update["売上"].where(df_update["売上"] &gt;= 0, other=0)

df_update[["名前", "売上"]]</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;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">田中</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">12000</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;">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;">18500</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;">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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">9200</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;">15000</td></tr></tbody></table>
<p><code>where()</code>や<code>mask()</code>で処理した結果を残したい場合は、<strong>新しい列に入れるか、元の列に代入する</strong>必要があります。</p>
<h2><span id="toc16">よくあるミス2：条件式の向きが逆になる</span></h2>
<p><code>where()</code>と<code>mask()</code>で一番多いミスは、条件式の向きを逆にしてしまうことです。</p>
<p>たとえば、「60点以上だけ残したい」のに、次のように書くと意図と逆になります。</p>
<pre class="line-numbers"><code class="language-python">wrong = pd.DataFrame({
    "名前": df["名前"],
    "点数": df["点数"],
    "意図と逆になりやすい例": df["点数"].where(df["点数"] &lt; 60)
})

wrong</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;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">田中</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82</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;">佐藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">55</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">55.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;">91</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;">高橋</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47.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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60</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;">山本</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td></tr></tbody></table>
<p>上の例では、<code>df["点数"] &lt; 60</code>という条件を書いているため、60点未満の値が残っています。</p>
<p>「60点以上だけ残したい」なら、条件は次のように書きます。</p>
<pre class="line-numbers"><code class="language-python">correct = pd.DataFrame({
    "名前": df["名前"],
    "点数": df["点数"],
    "60点以上だけ残す": df["点数"].where(df["点数"] &gt;= 60)
})

correct</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;">60点以上だけ残す</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;">82</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82.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;">55</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;">鈴木</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">91.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;">高橋</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">47</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;">伊藤</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">60.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;">山本</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">73.0</td></tr></tbody></table>
<p><code>where()</code>では、<strong>残したい条件を書く</strong>と覚えると、条件式の向きを間違えにくくなります。</p>
<p>逆に、<code>mask()</code>では、<strong>置き換えたい条件を書く</strong>と考えると分かりやすいです。</p>
<h2><span id="toc17">条件に合わない値をNaNにしたあとの流れ</span></h2>
<p><code>where()</code>や<code>mask()</code>で値を<code>NaN</code>にしたあと、そのまま終わりではありません。</p>
<p><code>NaN</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;">欠損値の数を確認したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>isnull().sum()</code></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;"><code>fillna()</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>dropna()</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>groupby()</code>、<code>value_counts()</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>
</tbody>
</table>
<p>ここでは、年齢が120歳を超える値を<code>NaN</code>にしたあと、欠損値の数を確認してみます。</p>
<pre class="line-numbers"><code class="language-python">age_checked = df["年齢"].mask(df["年齢"] &gt; 120)

age_checked.isnull().sum()</code></pre>
<pre class="colab-output">np.int64(1)</pre>
<p>このように、<code>where()</code>や<code>mask()</code>は「欠損値を作る」ことがあります。<br/>
そのため、後続の<code>fillna()</code>や<code>dropna()</code>、集計・可視化とセットで考えると、データ分析の流れがつかみやすくなります。</p>
<h2><span id="toc18">np.where()には軽く触れる程度でよい</span></h2>
<p>条件に応じて値を変える方法として、<code>np.where()</code>もよく見かけます。</p>
<p>ただし、初心者が最初に学ぶ場合は、まず<code>pandas</code>の<code>where()</code>と<code>mask()</code>で、<strong>残す条件・置き換える条件</strong>の考え方を理解するのがおすすめです。</p>
<p><code>np.where()</code>は、たとえば「合格」「不合格」のような新しい列を作るときに便利です。</p>
<pre class="line-numbers"><code class="language-python">import numpy as np

df_np = df.copy()
df_np["判定"] = np.where(df_np["点数"] &gt;= 60, "合格", "再確認")

df_np[["名前", "点数", "判定"]]</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;">0</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">田中</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">82</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;">55</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;">91</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;">47</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;">60</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;">73</td><td style="white-space: nowrap; padding: 0.2em 0.4em;">合格</td></tr></tbody></table>
<p>ここでは、<code>np.where()</code>の詳細には深入りしません。</p>
<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;"><code>where()</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>mask()</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>np.where()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">条件に応じて新しい配列・列を作る</td>
</tr>
</tbody>
</table>
<p>新しい列の作り方を詳しく学びたい場合は、条件付き列追加の記事と合わせて学ぶと理解しやすくなります。</p>
<h2><span id="toc19">データ分析の流れではどこで使うか</span></h2>
<p><code>where()</code>と<code>mask()</code>は、単独で覚えるよりも、データ分析の流れの中で考えると使いどころが見えやすくなります。</p>
<p>たとえば、次のような流れです。</p>
<ol>
<li>CSVやExcelを読み込む</li>
<li><code>head()</code>で先頭を確認する</li>
<li><code>info()</code>や<code>describe()</code>で型・欠損値・統計量を確認する</li>
<li><code>unique()</code>や<code>value_counts()</code>で不自然な値を見つける</li>
<li><code>replace()</code>で表記ゆれを直す</li>
<li><code>where()</code>や<code>mask()</code>で条件に合わない値を整理する</li>
<li><code>fillna()</code>で欠損値を補う</li>
<li><code>groupby()</code>やグラフで集計・可視化する</li>
</ol>
<p>つまり、<code>where()</code>と<code>mask()</code>は、<strong>値を確認したあと、集計や可視化に進む前の前処理</strong>として使うと自然です。</p>
<p>特に、外れ値や不自然な値をそのまま集計すると、平均値やグラフが読みにくくなることがあります。<br/>
その前に、どの値を残し、どの値を確認対象にするかを整理するのが大切です。</p>
<h2><span id="toc20">まとめ</span></h2>
<p>この記事では、<code>pandas</code>の<code>where()</code>と<code>mask()</code>の使い方を解説しました。</p>
<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;"><code>where()</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>mask()</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>other</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;">条件式の考え方</td><td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>where()</code>は残したい条件、<code>mask()</code>は置き換えたい条件を書く</td></tr><tr><td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>replace()</code>との違い</td><td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>replace()</code>は特定の値そのものを置き換える</td></tr><tr><td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>fillna()</code>との違い</td><td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>fillna()</code>はすでにある欠損値を埋める</td></tr><tr><td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>loc</code>との違い</td><td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>loc</code>は条件に合う行・列を指定して代入する</td></tr><tr><td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>np.where()</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;">整数列が<code>82.0</code>のように小数表示になることがある</td></tr></tbody></table>
<p><code>where()</code>と<code>mask()</code>は、条件に応じて値を残す・置き換えるための前処理で役立ちます。</p>
<p>最初は難しく感じるかもしれませんが、次の2つだけ覚えておけば大丈夫です。</p>
<ul>
<li><strong>残したい条件を書くなら<code>where()</code></strong></li>
<li><strong>置き換えたい条件を書くなら<code>mask()</code></strong></li>
</ul>
<p>この考え方を押さえると、条件に応じた値の整理がかなり分かりやすくなります。</p>
<h2><span id="toc21">次に読みたい関連記事</span></h2>
<p>今回の記事とあわせて読むと、Pandasの前処理の流れがつかみやすくなります。</p>
<ul>
<li><a href="https://pythondatalab.com/pandas-info-describe/">Pandas info()とdescribe()の違い｜欠損値・型・統計量の見方を例で解説</a></li>
<li><a href="https://pythondatalab.com/pandas-replace/">pandas replace()の使い方｜値の置換・表記ゆれ・欠損値変換を解説</a></li>
<li><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方｜欠損値を0・平均値・中央値・最頻値で埋める方法を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-filtering/">pandas 条件抽出（filtering）入門｜AND/OR・query関数・複数条件の指定方法</a></li>
<li><a href="https://pythondatalab.com/pandas-loc/">【初心者向け】Pandasのlocで行や列をラベルで抽出する基本操作をやさしく解説【図解あり】</a></li>
<li><a href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</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="toc22"> カテゴリから探す</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-1778074181310" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">where()とmask()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>where()</code>は、条件を満たす値を残し、条件を満たさない値を置き換えます。<br /><code>mask()</code>は逆に、条件を満たす値を置き換えます。<br />迷ったときは、<code>where()</code>は「残したい条件」、<code>mask()</code>は「置き換えたい条件」を書くと考えると分かりやすいです。</p>

</div>
</div>
<div id="faq-question-1778074208970" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">where()とreplace()はどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p><code>replace()</code>は、特定の値そのものを置き換えるときに向いています。<br />たとえば、<code>"未入力"</code>を<code>NaN</code>にしたい場合は<code>replace()</code>が分かりやすいです。<br />一方、<code>60点未満</code>や<code>0未満</code>のように、条件式で判断したい場合は<code>where()</code>や<code>mask()</code>が向いています。</p>

</div>
</div>
<div id="faq-question-1778074229954" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">where()とlocで条件代入する方法は何が違いますか？</span></h3>
<div class="rank-math-answer ">

<p><code>loc</code>は、条件に合う行と列を指定して代入する方法です。<br /><code>where()</code>は、条件を満たす値を残し、条件を満たさない値を置き換えた結果を作る方法です。<br />どちらでも同じ結果を作れる場面はあります。<br />初心者のうちは、行・列を指定して変更したいなら<code>loc</code>、値を条件に応じて残す・置き換えるなら<code>where()</code>や<code>mask()</code>と考えると整理しやすいです。</p>

</div>
</div>
<div id="faq-question-1778074251258" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">where()で元のDataFrameが変わらないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>where()</code>を実行しただけでは、元のDataFrameは自動で書き換わりません。<br />処理結果を残したい場合は、次のように代入します。<br /><code>df["列名"] = df["列名"].where(条件, other=置き換える値)</code></p>
<p>元データを残したい場合は、新しい列に保存すると確認しやすいです。</p>

</div>
</div>
<div id="faq-question-1778074268378" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">条件に合わない値をNaNにするにはどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p><code>where()</code>で<code>other</code>を指定しなければ、条件を満たさない値は<code>NaN</code>になります。<br /><code>df["点数"].where(df["点数"] &gt;= 60)</code></p>
<p>この例では、60点以上はそのまま残り、60点未満は<code>NaN</code>になります。</p>

</div>
</div>
<div id="faq-question-1778074293682" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">np.where()とpandasのwhere()はどちらを使えばよいですか？</span></h3>
<div class="rank-math-answer ">

<p>まずは、<code>pandas</code>の<code>where()</code>と<code>mask()</code>で考え方を理解するのがおすすめです。<br />・条件を満たす値を残したい → <code>where()</code><br />・条件を満たす値を置き換えたい → <code>mask()</code><br />・条件に応じて新しい列を作りたい → <code>np.where()</code>も候補<br /><code>np.where()</code>は便利ですが、この記事では詳しい使い方には深入りしません。</p>

</div>
</div>
<div id="faq-question-1778074311090" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">複数条件でもwhere()は使えますか？</span></h3>
<div class="rank-math-answer ">

<p>使えます。<br />複数条件を使う場合は、各条件を<code>()</code>で囲み、AND条件は<code>&amp;</code>でつなぎます。<br /><code>df["点数"].where((df["点数"] &gt;= 60) &amp; (df["点数"] &lt;= 90))</code></p>
<p>ただし、複数条件は初心者が混乱しやすいため、最初は単一条件で<code>where()</code>と<code>mask()</code>の考え方を理解するのがおすすめです。</p>

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

<p><code>fillna()</code>は、すでにある<code>NaN</code>を0や平均値などで埋めるメソッドです。<br />一方、<code>where()</code>や<code>mask()</code>は、条件に応じて値を<code>NaN</code>にしたり、別の値に置き換えたりできます。<br />流れとしては、<code>where()</code>や<code>mask()</code>で確認が必要な値を<code>NaN</code>にし、そのあと必要に応じて<code>fillna()</code>で補う、という使い方があります。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-where-mask/">pandas where()・mask()の使い方｜条件に応じて値を残す・置き換える方法</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-where-mask/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
