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

<channel>
	<title>Pandasデータ抽出・前処理入門｜loc, iloc, isin, dropの使い方まとめ | Python Data Lab（Pythonデータラボ）</title>
	<atom:link href="https://pythondatalab.com/category/pandas/preprocessing/feed/" rel="self" type="application/rss+xml" />
	<link>https://pythondatalab.com</link>
	<description>Python初心者向けに、わかりやすいデータ分析の解説を提供します。</description>
	<lastBuildDate>Sat, 12 Sep 2026 09:32:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.1</generator>

<image>
	<url>https://pythondatalab.com/wp-content/uploads/2025/12/cropped-rogo-32x32.png</url>
	<title>Pandasデータ抽出・前処理入門｜loc, iloc, isin, dropの使い方まとめ | Python Data Lab（Pythonデータラボ）</title>
	<link>https://pythondatalab.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>pandas drop()の使い方｜行・列を削除するindex・columns・axisを初心者向けに解説</title>
		<link>https://pythondatalab.com/pandas-drop-rows-columns/</link>
					<comments>https://pythondatalab.com/pandas-drop-rows-columns/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 12 Sep 2026 09:31:39 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2218</guid>

					<description><![CDATA[<p>pandasのdrop()でDataFrameの行・列を削除する方法を初心者向けに解説。index・columns・axisの違い、複数行・複数列、条件削除、反映されない原因、KeyErrorの対処までコードと処理前後表で確認できます。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-drop-rows-columns/">pandas drop()の使い方｜行・列を削除するindex・columns・axisを初心者向けに解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<!-- WordPressのカスタムHTMLブロックへ、このファイルの内容を貼り付けてください。 -->
<style>
.pdl-article{max-width:100%;box-sizing:border-box;line-height:1.9;color:#222;overflow-wrap:anywhere}
.pdl-article *{box-sizing:border-box}
.pdl-article h2{margin:2.2em 0 .8em;padding:.55em .75em;border-left:6px solid #1769aa;background:#f2f7fb;font-size:1.5em;line-height:1.45}
.pdl-article h3{margin:1.7em 0 .65em;padding-bottom:.35em;border-bottom:2px solid #d7e4ef;font-size:1.2em;line-height:1.5}
.pdl-article p,.pdl-article li{font-size:1em}
.pdl-article a{overflow-wrap:anywhere}
.pdl-article .pdl-table-scroll{width:100%;max-width:100%;margin:1.2em 0;overflow-x:auto;-webkit-overflow-scrolling:touch}
.pdl-article table{width:100%;min-width:620px;border-collapse:collapse;border-spacing:0;background:#fff}
.pdl-article th,.pdl-article td{border:1px solid #9aa7b2;padding:.65em .75em;text-align:left;vertical-align:top;white-space:normal}
.pdl-article th{background:#eaf2f8;font-weight:700}
.pdl-article tr:nth-child(even) td{background:#fafcfd}
.pdl-article pre{width:100%;max-width:100%;margin:1em 0;padding:1em;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:pre;word-break:normal;overflow-wrap:normal;border-radius:6px;background:#1e1e1e;color:#f5f5f5;font-size:.9em;line-height:1.65}
.pdl-article pre.pdl-output{margin-top:.25em;background:#f6f8fa;color:#222;border:1px solid #c9d1d9}
.pdl-article .pdl-output-label{margin-top:1em;font-weight:700;color:#34495e}
.pdl-article code{font-family:Consolas,Monaco,'Courier New',monospace}
.pdl-article :not(pre)>code{padding:.12em .35em;border-radius:4px;background:#f1f3f5;color:#c7254e;overflow-wrap:anywhere}
@media (max-width:600px){
  .pdl-article{line-height:1.8}
  .pdl-article h2{font-size:1.3em}
  .pdl-article h3{font-size:1.12em}
  .pdl-article table{min-width:560px;font-size:.9em}
  .pdl-article th,.pdl-article td{padding:.55em .6em}
  .pdl-article pre{font-size:.82em;padding:.85em}
}
</style>
<div class="pdl-article">
<p>pandasのDataFrameから「この行だけ消したい」「この列は分析に使わないので削除したい」というときは、<code>drop()</code>を使います。</p>
<p>ただし、初めて使うと「<code>axis=0</code>と<code>axis=1</code>のどちら？」「削除したのに元のDataFrameが変わらない」「上から2行目を消したつもりが別の行が消えた」と迷いやすいメソッドでもあります。</p>
<p>この記事では、Google Colabでそのまま実行できるコードを使い、行・列の削除から複数指定、条件削除、エラー対策まで順番に確認します。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：行はindex、列はcolumnsで削除する</a></li><li><a href="#toc3" tabindex="0">pandas drop()とは</a></li><li><a href="#toc4" tabindex="0">サンプルデータを用意する</a></li><li><a href="#toc5" tabindex="0">drop()で行を削除する</a><ol><li><a href="#toc6" tabindex="0">indexラベルを指定して1行削除する</a></li><li><a href="#toc7" tabindex="0">複数行をリストでまとめて削除する</a></li><li><a href="#toc8" tabindex="0">行ラベルと行番号の違い</a></li></ol></li><li><a href="#toc9" tabindex="0">drop()で列を削除する</a><ol><li><a href="#toc10" tabindex="0">columnsで1列削除する</a></li><li><a href="#toc11" tabindex="0">複数列をリストでまとめて削除する</a></li><li><a href="#toc12" tabindex="0">列番号で指定するときはdf.columnsを使う</a></li></ol></li><li><a href="#toc13" tabindex="0">行と列を同時に削除する</a></li><li><a href="#toc14" tabindex="0">axis=0とaxis=1の違い</a></li><li><a href="#toc15" tabindex="0">条件に合う行を削除する</a></li><li><a href="#toc16" tabindex="0">処理前後表で確認する</a></li><li><a href="#toc17" tabindex="0">drop()が反映されない原因</a><ol><li><a href="#toc18" tabindex="0">戻り値を変数へ代入する</a></li><li><a href="#toc19" tabindex="0">inplace=Trueの動作と注意点</a></li></ol></li><li><a href="#toc20" tabindex="0">KeyErrorが出る原因と対処法</a><ol><li><a href="#toc21" tabindex="0">KeyErrorの確認表</a></li><li><a href="#toc22" tabindex="0">errors=&#8221;ignore&#8221;を使ってよい場面</a></li></ol></li><li><a href="#toc23" tabindex="0">行削除後のindexを振り直す</a></li><li><a href="#toc24" tabindex="0">drop()・dropna()・drop_duplicates()の違い</a></li><li><a href="#toc25" tabindex="0">よくあるミス</a></li><li><a href="#toc26" tabindex="0">実務例：分析に不要な列と取消データを除く</a></li><li><a href="#toc27" tabindex="0">まとめ</a><ol><li><a href="#toc28" tabindex="0">次に読みたい関連記事</a></li><li><a href="#toc29" tabindex="0">公式ドキュメント</a></li><li><a href="#toc30" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc31" tabindex="0">pandasのdrop()で行を削除するにはどう書きますか？</a></li><li><a href="#toc32" tabindex="0">pandasのdrop()で列を削除するにはどう書きますか？</a></li><li><a href="#toc33" tabindex="0">axis=0とaxis=1の違いは何ですか？</a></li><li><a href="#toc34" tabindex="0">drop()を実行しても元のDataFrameに反映されないのはなぜですか？</a></li><li><a href="#toc35" tabindex="0">drop()・dropna()・drop_duplicates()はどう使い分けますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2 id="この記事でわかること"><span id="toc1">この記事でわかること</span></h2>
<ul>
<li><code>drop(index=...)</code>で指定した行を削除する方法</li>
<li><code>drop(columns=...)</code>で指定した列を削除する方法</li>
<li>行ラベルと「上から何行目」という位置の違い</li>
<li>複数行・複数列や、行と列を同時に削除する方法</li>
<li><code>drop()</code>が反映されない原因と<code>inplace=True</code>の注意点</li>
<li><code>KeyError</code>が出たときの確認方法</li>
<li><code>drop()</code>・<code>dropna()</code>・<code>drop_duplicates()</code>の使い分け</li>
</ul>
<p>DataFrameそのものから確認したい方は、先に<a href="https://pythondatalab.com/pandas-dataframe/">DataFrameの作り方と基本操作</a>をご覧ください。</p>
<h2 id="先に結論行はindex列はcolumnsで削除する"><span id="toc2">先に結論：行はindex、列はcolumnsで削除する</span></h2>
<p>初心者は、次の2つを基本形として覚えると迷いにくくなります。</p>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th>削除したいもの</th>
<th>推奨コード</th>
<th>指定するもの</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>1行</td>
<td><code>df.drop(index=行ラベル)</code></td>
<td>DataFrameのindex</td>
</tr>
<tr class="even">
<td>1列</td>
<td><code>df.drop(columns="列名")</code></td>
<td>DataFrameの列名</td>
</tr>
<tr class="odd">
<td>複数行</td>
<td><code>df.drop(index=[行ラベル1, 行ラベル2])</code></td>
<td>行ラベルのリスト</td>
</tr>
<tr class="even">
<td>複数列</td>
<td><code>df.drop(columns=["列名1", "列名2"])</code></td>
<td>列名のリスト</td>
</tr>
</tbody>
</table></div>
<p><code>axis=0</code>と<code>axis=1</code>でも指定できますが、<code>index=</code>・<code>columns=</code>のほうが、行と列のどちらを削除するのかコードから読み取りやすくなります。</p>
<h2 id="pandas-dropとは"><span id="toc3">pandas drop()とは</span></h2>
<p><code>DataFrame.drop()</code>は、指定した<strong>行ラベルまたは列ラベルを除いたDataFrameを返す</strong>メソッドです。</p>
<p>通常は元のDataFrameを直接変更しません。結果を残す場合は、<code>df = df.drop(...)</code>のように変数へ代入します。この点が「実行したのに削除が反映されない」と感じる主な原因です。</p>
<h2 id="サンプルデータを用意する"><span id="toc4">サンプルデータを用意する</span></h2>
<p>最初にpandasのバージョンを確認し、5件の売上データを作ります。この記事では、すべてこのDataFrameを使います。</p>
<pre><code class="language-python">import pandas as pd

print("pandas version:", pd.__version__)

df = pd.DataFrame(
    {
        "商品": ["ノートPC", "マウス", "キーボード", "モニター", "USBメモリ"],
        "地域": ["東京", "大阪", "東京", "名古屋", "大阪"],
        "売上": [1200, 800, 1500, 700, 1100],
        "利益": [240, 160, 300, 140, 220],
    },
    index=[100, 101, 102, 103, 104],
)

print(df)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>pandas version: 2.2.3
         商品   地域    売上   利益
100   ノートPC   東京  1200  240
101     マウス   大阪   800  160
102   キーボード   東京  1500  300
103    モニター  名古屋   700  140
104  USBメモリ   大阪  1100  220</code></pre>

<p>左端の<code>100</code>〜<code>104</code>が行の<strong>indexラベル</strong>です。表の上から数えた位置とは別の情報として扱います。</p>
<h2 id="dropで行を削除する"><span id="toc5">drop()で行を削除する</span></h2>
<h3 id="indexラベルを指定して1行削除する"><span id="toc6">indexラベルを指定して1行削除する</span></h3>
<p>indexラベル<code>101</code>の行を削除します。目的は「マウスの行を削除する」ことです。</p>
<pre><code class="language-python">df_row_dropped = df.drop(index=101)
print(df_row_dropped)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>         商品   地域    売上   利益
100   ノートPC   東京  1200  240
102   キーボード   東京  1500  300
103    モニター  名古屋   700  140
104  USBメモリ   大阪  1100  220</code></pre>

<p>indexラベル<code>101</code>の行だけがなくなりました。元の<code>df</code>ではなく、結果を<code>df_row_dropped</code>へ代入しています。</p>
<h3 id="複数行をリストでまとめて削除する"><span id="toc7">複数行をリストでまとめて削除する</span></h3>
<p>複数の行は、indexラベルをリストで渡します。</p>
<pre><code class="language-python">df_rows_dropped = df.drop(index=[101, 103])
print(df_rows_dropped)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>         商品  地域    売上   利益
100   ノートPC  東京  1200  240
102   キーボード  東京  1500  300
104  USBメモリ  大阪  1100  220</code></pre>

<p>indexラベル<code>101</code>と<code>103</code>の2行が削除されました。</p>
<h3 id="行ラベルと行番号の違い"><span id="toc8">行ラベルと行番号の違い</span></h3>
<p><code>drop(index=101)</code>の<code>101</code>は「上から101行目」ではなく、<strong>indexラベル101</strong>です。</p>
<p>上から2行目を削除したい場合は、<code>df.index[1]</code>でその位置にあるラベルを取得します。Pythonは0から数えるため、<code>[1]</code>が上から2行目です。</p>
<pre><code class="language-python">second_row_label = df.index[1]
print("上から2行目のindexラベル:", second_row_label)

df_by_position = df.drop(index=second_row_label)
print(df_by_position)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>上から2行目のindexラベル: 101
         商品   地域    売上   利益
100   ノートPC   東京  1200  240
102   キーボード   東京  1500  300
103    モニター  名古屋   700  140
104  USBメモリ   大阪  1100  220</code></pre>

<p>今回は上から2行目のラベルが<code>101</code>なので、マウスの行が削除されました。indexが並べ替えられていたり、文字列になっていたりしても、位置からラベルを取得すれば意図を明確にできます。</p>
<h2 id="dropで列を削除する"><span id="toc9">drop()で列を削除する</span></h2>
<h3 id="columnsで1列削除する"><span id="toc10">columnsで1列削除する</span></h3>
<p>「利益」列を削除します。</p>
<pre><code class="language-python">df_column_dropped = df.drop(columns="利益")
print(df_column_dropped)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>         商品   地域    売上
100   ノートPC   東京  1200
101     マウス   大阪   800
102   キーボード   東京  1500
103    モニター  名古屋   700
104  USBメモリ   大阪  1100</code></pre>

<p>「利益」列だけがなくなり、「商品」「地域」「売上」は残っています。</p>
<h3 id="複数列をリストでまとめて削除する"><span id="toc11">複数列をリストでまとめて削除する</span></h3>
<pre><code class="language-python">df_columns_dropped = df.drop(columns=["地域", "利益"])
print(df_columns_dropped)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>         商品    売上
100   ノートPC  1200
101     マウス   800
102   キーボード  1500
103    モニター   700
104  USBメモリ  1100</code></pre>

<p>「地域」と「利益」の2列が削除されました。</p>
<h3 id="列番号で指定するときはdfcolumnsを使う"><span id="toc12">列番号で指定するときはdf.columnsを使う</span></h3>
<p>上からではなく左から2列目を削除したい場合は、<code>df.columns[1]</code>で列名を取得します。</p>
<pre><code class="language-python">second_column_name = df.columns[1]
print("左から2列目の列名:", second_column_name)

df_by_column_position = df.drop(columns=second_column_name)
print(df_by_column_position)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>左から2列目の列名: 地域
         商品    売上   利益
100   ノートPC  1200  240
101     マウス   800  160
102   キーボード  1500  300
103    モニター   700  140
104  USBメモリ  1100  220</code></pre>

<p>左から2列目は「地域」なので、その列が削除されました。列番号を直接<code>columns=1</code>へ渡すのではなく、<code>df.columns[1]</code>から実際の列名を取得する点が重要です。</p>
<h2 id="行と列を同時に削除する"><span id="toc13">行と列を同時に削除する</span></h2>
<p><code>index=</code>と<code>columns=</code>は同時に指定できます。ここでは2行と1列を一度に削除します。</p>
<pre><code class="language-python">df_both_dropped = df.drop(index=[101, 103], columns=["利益"])
print(df_both_dropped)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>         商品  地域    売上
100   ノートPC  東京  1200
102   キーボード  東京  1500
104  USBメモリ  大阪  1100</code></pre>

<p>indexラベル<code>101</code>・<code>103</code>の行と、「利益」列が同時に削除されています。</p>
<h2 id="axis0とaxis1の違い"><span id="toc14">axis=0とaxis=1の違い</span></h2>
<p><code>labels</code>と<code>axis</code>を組み合わせる書き方もあります。</p>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th style="text-align: right;">axis</th>
<th>対象</th>
<th><code>index</code>・<code>columns</code>で書く場合</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;"><code>axis=0</code>または<code>axis="index"</code></td>
<td>行</td>
<td><code>index=...</code></td>
</tr>
<tr class="even">
<td style="text-align: right;"><code>axis=1</code>または<code>axis="columns"</code></td>
<td>列</td>
<td><code>columns=...</code></td>
</tr>
</tbody>
</table></div>
<p>次の2つは同じ結果になります。</p>
<pre><code class="language-python">result_with_axis = df.drop(labels="利益", axis=1)
result_with_columns = df.drop(columns="利益")

print("2つの結果は同じ:", result_with_axis.equals(result_with_columns))
print(result_with_axis)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>2つの結果は同じ: True
         商品   地域    売上
100   ノートPC   東京  1200
101     マウス   大阪   800
102   キーボード   東京  1500
103    モニター  名古屋   700
104  USBメモリ   大阪  1100</code></pre>

<p><code>True</code>と表示されれば、2つの結果は同じです。既存コードを読むために<code>axis</code>の意味は必要ですが、自分で書くときは<code>index=</code>・<code>columns=</code>を使うと取り違えを減らせます。</p>
<h2 id="条件に合う行を削除する"><span id="toc15">条件に合う行を削除する</span></h2>
<p>「売上が1000未満の行を削除する」場合は、最初に条件に合う行のindexを取得し、そのindexを<code>drop()</code>へ渡します。</p>
<pre><code class="language-python">delete_index = df.index[df["売上"] &lt; 1000]
print("削除対象のindex:", delete_index.tolist())

df_condition_dropped = df.drop(index=delete_index)
print(df_condition_dropped)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>削除対象のindex: [101, 103]
         商品  地域    売上   利益
100   ノートPC  東京  1200  240
102   キーボード  東京  1500  300
104  USBメモリ  大阪  1100  220</code></pre>

<p>売上が1000未満のindexラベル<code>101</code>と<code>103</code>が削除されました。</p>
<p>同じ結果は「売上が1000以上の行だけ残す」と考えて、条件抽出でも作れます。</p>
<pre><code class="language-python">df_filtered = df[df["売上"] &gt;= 1000]

print("drop()と条件抽出の結果は同じ:", df_condition_dropped.equals(df_filtered))
print(df_filtered)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>drop()と条件抽出の結果は同じ: True
         商品  地域    売上   利益
100   ノートPC  東京  1200  240
102   キーボード  東京  1500  300
104  USBメモリ  大阪  1100  220</code></pre>

<p>結果は同じです。削除対象のindexが明確なら<code>drop()</code>、残す条件をそのまま表現したいなら条件抽出が読みやすいことがあります。条件式を反転させると結果も逆になるため、処理前後の行数を必ず確認しましょう。</p>
<p>条件指定を詳しく確認したい方は、<a href="https://pythondatalab.com/pandas-filtering/">pandasでAND・OR・queryを使って条件抽出する方法</a>も参考にしてください。</p>
<h2 id="処理前後表で確認する"><span id="toc16">処理前後表で確認する</span></h2>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th>操作</th>
<th>処理前</th>
<th>指定</th>
<th>処理後</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>1行削除</td>
<td>5行×4列</td>
<td><code>index=101</code></td>
<td>4行×4列</td>
</tr>
<tr class="even">
<td>1列削除</td>
<td>5行×4列</td>
<td><code>columns="利益"</code></td>
<td>5行×3列</td>
</tr>
<tr class="odd">
<td>2行・1列を同時削除</td>
<td>5行×4列</td>
<td><code>index=[101, 103]</code>, <code>columns=["利益"]</code></td>
<td>3行×3列</td>
</tr>
<tr class="even">
<td>条件削除</td>
<td>5行×4列</td>
<td>売上1000未満</td>
<td>3行×4列</td>
</tr>
</tbody>
</table></div>
<p>行数・列数は<code>shape</code>でも検証できます。</p>
<pre><code class="language-python">print("処理前:", df.shape)
print("1行削除後:", df_row_dropped.shape)
print("1列削除後:", df_column_dropped.shape)
print("行・列の同時削除後:", df_both_dropped.shape)
print("条件削除後:", df_condition_dropped.shape)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>処理前: (5, 4)
1行削除後: (4, 4)
1列削除後: (5, 3)
行・列の同時削除後: (3, 3)
条件削除後: (3, 4)</code></pre>

<h2 id="dropが反映されない原因"><span id="toc17">drop()が反映されない原因</span></h2>
<h3 id="戻り値を変数へ代入する"><span id="toc18">戻り値を変数へ代入する</span></h3>
<p>通常の<code>drop()</code>は、削除後の新しいDataFrameを返します。元の<code>df</code>は変わりません。</p>
<pre><code class="language-python">temporary_result = df.drop(index=101)

print("削除結果の行数:", len(temporary_result))
print("元のdfの行数:", len(df))</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>削除結果の行数: 4
元のdfの行数: 5</code></pre>

<p>削除結果は4行ですが、元の<code>df</code>は5行のままです。結果を反映するなら、次のように再代入します。</p>
<pre><code class="language-python">df = df.drop(index=101)</code></pre>
<h3 id="inplacetrueの動作と注意点"><span id="toc19">inplace=Trueの動作と注意点</span></h3>
<p><code>inplace=True</code>を指定すると対象のDataFrameを直接変更し、戻り値は<code>None</code>になります。元のサンプルを壊さないよう、コピーで確認します。</p>
<pre><code class="language-python">df_copy = df.copy()
return_value = df_copy.drop(index=101, inplace=True)

print("戻り値:", return_value)
print("変更後のdf_copy:")
print(df_copy)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>戻り値: None
変更後のdf_copy:
         商品   地域    売上   利益
100   ノートPC   東京  1200  240
102   キーボード   東京  1500  300
103    モニター  名古屋   700  140
104  USBメモリ   大阪  1100  220</code></pre>

<p><code>return_value</code>は<code>None</code>ですが、<code>df_copy</code>からはindexラベル<code>101</code>の行が削除されています。</p>
<p>次の書き方は、<code>None</code>を<code>df</code>へ代入してしまうので避けてください。</p>
<pre><code class="language-python">df = df.drop(index=101, inplace=True)  # 誤り：dfがNoneになる</code></pre>
<p>初心者は、処理の結果を追いやすい<code>df = df.drop(...)</code>を基本にすると安全です。</p>
<h2 id="keyerrorが出る原因と対処法"><span id="toc20">KeyErrorが出る原因と対処法</span></h2>
<p>存在しない行ラベルや列名を指定すると、既定では<code>KeyError</code>になります。ここでは、存在しない「売上高」列を指定してエラーを確認します。</p>
<pre><code class="language-python">try:
    df.drop(columns="売上高")
except KeyError as error:
    print(type(error).__name__ + ":", error)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>KeyError: "['売上高'] not found in axis"</code></pre>

<h3 id="keyerrorの確認表"><span id="toc21">KeyErrorの確認表</span></h3>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th>確認項目</th>
<th>よくある原因</th>
<th>確認方法</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>列名</td>
<td>「売上」と「売上高」などの表記違い</td>
<td><code>df.columns.tolist()</code></td>
</tr>
<tr class="even">
<td>行ラベル</td>
<td>位置番号とindexラベルの混同</td>
<td><code>df.index.tolist()</code></td>
</tr>
<tr class="odd">
<td>大文字・小文字</td>
<td><code>Sales</code>と<code>sales</code>の違い</td>
<td>実際の列名を表示</td>
</tr>
<tr class="even">
<td>前後の空白</td>
<td><code>"売上 "</code>のような空白</td>
<td><code>repr()</code>などで確認</td>
</tr>
<tr class="odd">
<td>行・列</td>
<td><code>axis</code>の指定間違い</td>
<td><code>index=</code>・<code>columns=</code>を使う</td>
</tr>
</tbody>
</table></div>
<pre><code class="language-python">print("列名:", df.columns.tolist())
print("indexラベル:", df.index.tolist())</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>列名: ['商品', '地域', '売上', '利益']
indexラベル: [100, 101, 102, 103, 104]</code></pre>

<h3 id="errorsignoreを使ってよい場面"><span id="toc22">errors=&#8221;ignore&#8221;を使ってよい場面</span></h3>
<p><code>errors="ignore"</code>を指定すると、存在しないラベルを無視して、存在するラベルだけを削除できます。</p>
<pre><code class="language-python">df_ignored = df.drop(columns=["利益", "存在しない列"], errors="ignore")
print(df_ignored)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>         商品   地域    売上
100   ノートPC   東京  1200
101     マウス   大阪   800
102   キーボード   東京  1500
103    モニター  名古屋   700
104  USBメモリ   大阪  1100</code></pre>

<p>「利益」は削除され、「存在しない列」は無視されました。ただし、タイプミスまで見逃すため、手入力したコードのエラー回避として常用しないでください。削除候補が外部データから渡され、存在するものだけ処理したい場合など、意図が明確な場面に限定します。</p>
<h2 id="行削除後のindexを振り直す"><span id="toc23">行削除後のindexを振り直す</span></h2>
<p>行を削除してもindexは自動で連番に戻りません。必要な場合は<code>reset_index(drop=True)</code>を使います。</p>
<pre><code class="language-python">df_after_drop = df.drop(index=[101, 103])
df_after_reset = df_after_drop.reset_index(drop=True)

print("行削除後:")
print(df_after_drop)
print("\nindexを振り直した後:")
print(df_after_reset)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>行削除後:
         商品  地域    売上   利益
100   ノートPC  東京  1200  240
102   キーボード  東京  1500  300
104  USBメモリ  大阪  1100  220

</code><p><code>indexを振り直した後: 商品 地域 売上 利益 0 ノートPC 東京 1200 240 1 キーボード 東京 1500 300 2 USBメモリ 大阪 1100 220</code></p></pre><p></p>
<p><code>drop=True</code>を付けると、削除前のindexを新しい列として残さず、0からの連番にできます。詳しくは<a href="https://pythondatalab.com/pandas-reset-index/">reset_index()でインデックスを振り直す方法</a>をご覧ください。</p>
<h2 id="dropdropnadrop_duplicatesの違い"><span id="toc24">drop()・dropna()・drop_duplicates()の違い</span></h2>
<p>名前は似ていますが、削除する対象が異なります。</p>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th>目的</th>
<th>使うメソッド</th>
<th>代表例</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>指定した行・列を削除</td>
<td><code>drop()</code></td>
<td><code>df.drop(columns="利益")</code></td>
</tr>
<tr class="even">
<td>欠損値を含む行・列を削除</td>
<td><code>dropna()</code></td>
<td><code>df.dropna()</code></td>
</tr>
<tr class="odd">
<td>重複行を削除</td>
<td><code>drop_duplicates()</code></td>
<td><code>df.drop_duplicates()</code></td>
</tr>
<tr class="even">
<td>条件に合う行だけ残す</td>
<td>ブール条件</td>
<td><code>df[df["売上"] &gt;= 1000]</code></td>
</tr>
</tbody>
</table></div>
<ul>
<li>欠損値を削除したい場合：<a href="https://pythondatalab.com/pandas-drop/">dropna()で欠損値を削除する方法</a></li>
<li>重複行を削除したい場合：<a href="https://pythondatalab.com/pandas-drop-duplicates/">drop_duplicates()で重複行を削除する方法</a></li>
<li>削除前に重複を確認したい場合：<a href="https://pythondatalab.com/pandas-duplicated/">duplicated()で重複行を確認する方法</a></li>
</ul>
<h2 id="よくあるミス"><span id="toc25">よくあるミス</span></h2>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th>ミス</th>
<th>起こること</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>df.drop(1)</code>を「上から2行目」と決めつける</td>
<td>indexラベル1を探す</td>
<td>位置なら<code>df.index[1]</code>を使う</td>
</tr>
<tr class="even">
<td>列名を指定したのに行として扱われる</td>
<td><code>KeyError</code>になる</td>
<td><code>columns="列名"</code>を使う</td>
</tr>
<tr class="odd">
<td>戻り値を保存しない</td>
<td>元のdfが変わらない</td>
<td>再代入する</td>
</tr>
<tr class="even">
<td>再代入と<code>inplace=True</code>を同時に使う</td>
<td>変数が<code>None</code>になる</td>
<td>どちらか一方にする</td>
</tr>
<tr class="odd">
<td><code>errors="ignore"</code>を常用する</td>
<td>タイプミスを見逃す</td>
<td>原則は既定の<code>raise</code>で確認</td>
</tr>
<tr class="even">
<td>行削除後に連番だと思い込む</td>
<td>indexが飛んだままになる</td>
<td>必要なら<code>reset_index(drop=True)</code></td>
</tr>
</tbody>
</table></div>
<h2 id="実務例分析に不要な列と取消データを除く"><span id="toc26">実務例：分析に不要な列と取消データを除く</span></h2>
<p>実務では、最初に不要な管理列を削除し、その後に対象外の行を除くことがあります。元データを残しながら、分析用DataFrameを作ります。</p>
<pre><code class="language-python">raw_df = pd.DataFrame(
    {
        "伝票ID": ["A001", "A002", "A003", "A004"],
        "商品": ["ノートPC", "マウス", "モニター", "キーボード"],
        "売上": [120000, 3000, 35000, 8000],
        "状態": ["確定", "取消", "確定", "確定"],
        "取込メモ": ["batch1", "batch1", "batch2", "batch2"],
    }
)

cancel_index = raw_df.index[raw_df["状態"] == "取消"]
analysis_df = raw_df.drop(index=cancel_index, columns=["取込メモ"])
analysis_df = analysis_df.reset_index(drop=True)

print("処理前:")
print(raw_df)
print("\n処理後:")
print(analysis_df)</code></pre>

<div class="pdl-output-label">実行結果</div><pre class="pdl-output"><code>処理前:
   伝票ID     商品      売上  状態    取込メモ
0  A001  ノートPC  120000  確定  batch1
1  A002    マウス    3000  取消  batch1
2  A003   モニター   35000  確定  batch2
3  A004  キーボード    8000  確定  batch2

</code><p><code>処理後: 伝票ID 商品 売上 状態 0 A001 ノートPC 120000 確定 1 A003 モニター 35000 確定 2 A004 キーボード 8000 確定</code></p></pre><p></p>
<p>取消行と分析に不要な「取込メモ」列が除かれ、indexも0から振り直されました。実務では、削除前後の行数やIDを確認し、必要なデータまで消していないか検証してください。</p>
<h2 id="まとめ"><span id="toc27">まとめ</span></h2>
<ul>
<li>行を削除する基本形は<code>df.drop(index=行ラベル)</code></li>
<li>列を削除する基本形は<code>df.drop(columns="列名")</code></li>
<li>複数指定はリストを渡す</li>
<li><code>drop()</code>は位置ではなくラベルを指定する</li>
<li>通常は元のDataFrameが変わらないため、結果を再代入する</li>
<li><code>inplace=True</code>の戻り値は<code>None</code></li>
<li><code>KeyError</code>が出たら<code>df.index</code>と<code>df.columns</code>を確認する</li>
<li>行削除後に連番が必要なら<code>reset_index(drop=True)</code>を使う</li>
<li>欠損値には<code>dropna()</code>、重複には<code>drop_duplicates()</code>を使う</li>
</ul>
<p>まずは<code>index=</code>と<code>columns=</code>を使い分け、処理前後のDataFrameと行数・列数を確認する習慣を付けましょう。</p>
<h3 id="次に読みたい関連記事"><span id="toc28">次に読みたい関連記事</span></h3>
<ul>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrameとは？作り方・基本操作・Seriesとの違い</a></li>
<li><a href="https://pythondatalab.com/pandas-drop/">pandas dropna()の使い方｜欠損値を削除</a></li>
<li><a href="https://pythondatalab.com/pandas-drop-duplicates/">pandas drop_duplicates()の使い方｜重複行を削除</a></li>
<li><a href="https://pythondatalab.com/pandas-reset-index/">pandas reset_index()の使い方｜インデックスを振り直す</a></li>
<li><a href="https://pythondatalab.com/pandas-filtering/">pandas 条件抽出入門｜AND・OR・query</a></li>
</ul>
<h3 id="公式ドキュメント"><span id="toc29">公式ドキュメント</span></h3>
<ul>
<li><a rel="noopener" href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html" target="_blank">pandas.DataFrame.drop</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="toc30"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </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-1789205092243" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">pandasのdrop()で行を削除するにはどう書きますか？</span></h3>
<div class="rank-math-answer ">

<p><code>df.drop(index=行ラベル)</code>と書きます。複数行なら<code>df.drop(index=[行ラベル1, 行ラベル2])</code>のようにリストで指定します。</p>

</div>
</div>
<div id="faq-question-1789205103139" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">pandasのdrop()で列を削除するにはどう書きますか？</span></h3>
<div class="rank-math-answer ">

<p><code>df.drop(columns="列名")</code>と書きます。複数列なら<code>columns=["列名1", "列名2"]</code>と指定します。</p>

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

<p><code>axis=0</code>は行、<code>axis=1</code>は列です。自分でコードを書く場合は、意味が明確な<code>index=</code>・<code>columns=</code>を使うと間違いを減らせます。</p>

</div>
</div>
<div id="faq-question-1789205119557" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc34">drop()を実行しても元のDataFrameに反映されないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>通常の<code>drop()</code>は削除後の新しいDataFrameを返し、元のDataFrameを変更しないためです。<code>df = df.drop(...)</code>のように再代入します。<code>inplace=True</code>も使えますが、戻り値は<code>None</code>です。</p>

</div>
</div>
<div id="faq-question-1789205132762" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc35">drop()・dropna()・drop_duplicates()はどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p>指定した行・列なら<code>drop()</code>、欠損値を含む行・列なら<code>dropna()</code>、重複行なら<code>drop_duplicates()</code>を使います。削除の目的に合うメソッドを選びましょう。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-drop-rows-columns/">pandas drop()の使い方｜行・列を削除するindex・columns・axisを初心者向けに解説</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-drop-rows-columns/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas drop_duplicates()の使い方｜subset・keepで重複行を削除</title>
		<link>https://pythondatalab.com/pandas-drop-duplicates/</link>
					<comments>https://pythondatalab.com/pandas-drop-duplicates/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Fri, 11 Sep 2026 15:42:08 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2210</guid>

					<description><![CDATA[<p>pandasのdrop_duplicates()で重複行を安全に削除する方法を初心者向けに解説。subset・keepの選び方、削除前の確認、最新行の残し方、処理後の検算までGoogle Colabで実行できます。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-drop-duplicates/">pandas drop_duplicates()の使い方｜subset・keepで重複行を削除</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.line-numbers,
  .colab-article pre.colab-output {
    margin-top: 0 !important;
    margin-bottom: 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 #cbd5e1;
    white-space: nowrap;
    padding: 0.2em 0.4em;
  }
  .colab-article table.wp-block-table th {
    background-color: #f8fafc;
    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>pandasで売上データを整理していると、同じ注文IDが複数行に現れることがあります。しかし、値が重複しているからといって、すぐ削除してよいとは限りません。完全な二重登録だけでなく、金額を訂正した更新後の記録が混ざっている可能性もあるためです。</p>
<p><code>drop_duplicates()</code>は、重複の正誤を自動判定するメソッドではありません。<strong>先に<code>duplicated(keep=False)</code>で候補を確認し、<code>subset</code>で同一レコードの基準、<code>keep</code>で残す記録を決めてから削除する</strong>のが基本です。</p>
<p>この記事では、注文データを使って、重複候補の確認から削除、削除後の検算までをGoogle Colabで順番に実行します。最後には、自分のデータで「なぜこの行を残したか」を説明できる状態を目指します。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：判定列と残す行を決めてから削除する</a></li><li><a href="#toc3" tabindex="0">注文データを用意して処理前の状態を確認する</a><ol><li><a href="#toc4" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc5" tabindex="0">削除前にduplicated()で重複候補をすべて確認する</a><ol><li><a href="#toc6" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc7" tabindex="0">引数なしでは全列が同じ行だけを削除する</a><ol><li><a href="#toc8" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc9" tabindex="0">subsetで重複を判定する列を選ぶ</a><ol><li><a href="#toc10" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc11" tabindex="0">複数列の組み合わせで重複を判定する</a></li><li><a href="#toc12" tabindex="0">keepで残す行を選ぶ</a><ol><li><a href="#toc13" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc14" tabindex="0">最新の行を残すなら更新日時で並べてからkeep=&#8217;last&#8217;を使う</a><ol><li><a href="#toc15" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc16" tabindex="0">削除後は行数・残った値・重複件数を検算する</a><ol><li><a href="#toc17" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc18" tabindex="0">よくある失敗を現象から確認・修正する</a><ol><li><a href="#toc19" tabindex="0">重複が消えない</a></li><li><a href="#toc20" tabindex="0">必要な行まで消えた</a></li><li><a href="#toc21" tabindex="0">最新ではない行が残った</a></li><li><a href="#toc22" tabindex="0">元のDataFrameへ反映されない</a></li></ol></li><li><a href="#toc23" tabindex="0">NaNを含む判定列は削除前に意味を確認する</a></li><li><a href="#toc24" tabindex="0">自分のDataFrameへ置き換える前のチェックリスト</a></li><li><a href="#toc25" tabindex="0">重複を削除したデータを集計へつなげる</a><ol><li><a href="#toc26" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc27" tabindex="0">まとめ</a></li><li><a href="#toc28" tabindex="0">関連記事</a><ol><li><a href="#toc29" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc30" tabindex="0">drop_duplicates()とduplicated()の違いは何ですか？</a></li><li><a href="#toc31" tabindex="0">複数列が同じ行だけを削除するにはどうしますか？</a></li><li><a href="#toc32" tabindex="0">最新の行だけを残すにはどうしますか？</a></li><li><a href="#toc33" tabindex="0">実行しても元のDataFrameが変わらないのはなぜですか？</a></li><li><a href="#toc34" tabindex="0">NaNを含む行はどう判定されますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
  <li><code>duplicated()</code>と<code>drop_duplicates()</code>の役割の違い</li>
  <li><code>subset</code>で重複を判定する列を選ぶ方法</li>
  <li><code>keep='first'</code>・<code>keep='last'</code>・<code>keep=False</code>の選び方</li>
  <li>更新日時を確認して最新の記録を残す方法</li>
  <li>削除前後の行数・残った値・重複件数を検算する方法</li>
  <li>重複が消えない、消えすぎる、元のDataFrameへ反映されない場合の確認方法</li>
</ul>
<p><code>drop_duplicates()</code>は、データ分析の「読み込み→状態確認→前処理→集計」のうち、<strong>集計前の前処理</strong>で使います。前処理全体の順序を先に確認したい場合は、<a href="https://pythondatalab.com/pandas-preprocessing-basic/">Pandasデータ前処理の基本</a>を参照してください。</p>
<h2><span id="toc2">先に結論：判定列と残す行を決めてから削除する</span></h2>
<p>重複削除では、次の2点を先に決めます。</p>
<ol>
  <li><strong>どの列が同じなら同一レコードとみなすか</strong>：<code>subset</code>で指定する</li>
  <li><strong>重複した記録のどれを残すか</strong>：<code>keep</code>で指定する</li>
</ol>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>判断したいこと</th>
        <th>選ぶ設定</th>
        <th>適する場面</th>
        <th>注意点</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>全列が同じ行だけを削除したい</td>
        <td><code>subset</code>を指定しない</td>
        <td>完全なコピー行を除く</td>
        <td>一部の値が違う更新記録は残る</td>
      </tr>
      <tr>
        <td>注文IDなど特定列で判定したい</td>
        <td><code>subset='注文ID'</code></td>
        <td>1注文1行に整理する</td>
        <td>注文明細が複数行なら消しすぎる</td>
      </tr>
      <tr>
        <td>最初の行を残したい</td>
        <td><code>keep='first'</code></td>
        <td>先着記録を正とする</td>
        <td>デフォルトだが、最初が正しいとは限らない</td>
      </tr>
      <tr>
        <td>最後の行を残したい</td>
        <td><code>keep='last'</code></td>
        <td>最新記録を残す</td>
        <td>先に更新日時で並べる必要がある</td>
      </tr>
      <tr>
        <td>重複したグループを全行除外したい</td>
        <td><code>keep=False</code></td>
        <td>重複群を保留対象にする</td>
        <td>1行も残らない</td>
      </tr>
    </tbody>
  </table>
</div>
<p>正しい記録を判断できない場合は、削除せず候補を別のDataFrameへ取り出して確認します。</p>
<h2><span id="toc3">注文データを用意して処理前の状態を確認する</span></h2>
<h3><span id="toc4">実行目的</span></h3>
<p>完全に同じ行と、注文IDは同じでも売上・更新日時が異なる行を含むDataFrameを作ります。以降は同じデータを使うため、コード、表、出力の違いを追いやすくなります。</p>
<pre class="line-numbers language-python"><code class="language-python">import pandas as pd

orders = pd.DataFrame({
    "注文ID": ["A100", "A101", "A100", "A102", "A101", "A103", "A104", "A104"],
    "商品": ["ペン", "ノート", "ペン", "ファイル", "ノート", "消しゴム", "ペン", "ペン"],
    "売上": [1200, 800, 1200, 500, 900, 300, 600, 600],
    "更新日時": [
        "2026-09-01 09:00", "2026-09-01 10:00", "2026-09-01 09:00",
        "2026-09-02 11:00", "2026-09-03 15:00", "2026-09-03 16:00",
        "2026-09-04 10:00", "2026-09-04 10:00"
    ]
})

orders["更新日時"] = pd.to_datetime(orders["更新日時"])
display(orders)
print("処理前の行数:", len(orders))
print("更新日時のdtype:", orders["更新日時"].dtype)
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
      <th>更新日時</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A100</td>
      <td>ペン</td>
      <td>1200</td>
      <td>2026-09-01 09:00:00</td>
    </tr>
    <tr>
      <td>1</td>
      <td>A101</td>
      <td>ノート</td>
      <td>800</td>
      <td>2026-09-01 10:00:00</td>
    </tr>
    <tr>
      <td>2</td>
      <td>A100</td>
      <td>ペン</td>
      <td>1200</td>
      <td>2026-09-01 09:00:00</td>
    </tr>
    <tr>
      <td>3</td>
      <td>A102</td>
      <td>ファイル</td>
      <td>500</td>
      <td>2026-09-02 11:00:00</td>
    </tr>
    <tr>
      <td>4</td>
      <td>A101</td>
      <td>ノート</td>
      <td>900</td>
      <td>2026-09-03 15:00:00</td>
    </tr>
    <tr>
      <td>5</td>
      <td>A103</td>
      <td>消しゴム</td>
      <td>300</td>
      <td>2026-09-03 16:00:00</td>
    </tr>
    <tr>
      <td>6</td>
      <td>A104</td>
      <td>ペン</td>
      <td>600</td>
      <td>2026-09-04 10:00:00</td>
    </tr>
    <tr>
      <td>7</td>
      <td>A104</td>
      <td>ペン</td>
      <td>600</td>
      <td>2026-09-04 10:00:00</td>
    </tr>
  </tbody>
</table>
</div>
<pre class="colab-output">処理前の行数: 8
更新日時のdtype: datetime64[ns]</pre>
<p><code>orders</code>は8行です。注文ID<code>A100</code>と<code>A104</code>は全列が同じ完全重複です。<code>A101</code>は2行ありますが、売上が800から900へ変わり、更新日時も異なります。</p>
<p>ここで見るべきなのは、注文IDだけではありません。<code>A101</code>の2行は更新前後の記録と考えられるため、どちらを残すか判断するには<code>更新日時</code>も必要です。</p>
<h2><span id="toc5">削除前にduplicated()で重複候補をすべて確認する</span></h2>
<h3><span id="toc6">実行目的</span></h3>
<p><code>drop_duplicates()</code>で消す前に、注文IDが重複する行をすべて表示します。<code>keep=False</code>は、重複グループの先頭行も含めてすべて<code>True</code>にする指定です。</p>
<pre class="line-numbers language-python"><code class="language-python">duplicate_mask = orders.duplicated(subset="注文ID", keep=False)
duplicate_candidates = orders.loc[duplicate_mask].sort_values(
    ["注文ID", "更新日時"]
)

display(duplicate_candidates)
print("重複候補の行数:", duplicate_mask.sum())
print("重複している注文ID:", duplicate_candidates["注文ID"].unique().tolist())
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
      <th>更新日時</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A100</td>
      <td>ペン</td>
      <td>1200</td>
      <td>2026-09-01 09:00:00</td>
    </tr>
    <tr>
      <td>2</td>
      <td>A100</td>
      <td>ペン</td>
      <td>1200</td>
      <td>2026-09-01 09:00:00</td>
    </tr>
    <tr>
      <td>1</td>
      <td>A101</td>
      <td>ノート</td>
      <td>800</td>
      <td>2026-09-01 10:00:00</td>
    </tr>
    <tr>
      <td>4</td>
      <td>A101</td>
      <td>ノート</td>
      <td>900</td>
      <td>2026-09-03 15:00:00</td>
    </tr>
    <tr>
      <td>6</td>
      <td>A104</td>
      <td>ペン</td>
      <td>600</td>
      <td>2026-09-04 10:00:00</td>
    </tr>
    <tr>
      <td>7</td>
      <td>A104</td>
      <td>ペン</td>
      <td>600</td>
      <td>2026-09-04 10:00:00</td>
    </tr>
  </tbody>
</table>
</div>
<pre class="colab-output">重複候補の行数: 6
重複している注文ID: ['A100', 'A101', 'A104']</pre>
<p>重複候補は6行で、注文IDは<code>A100</code>・<code>A101</code>・<code>A104</code>です。<code>A100</code>と<code>A104</code>は完全重複ですが、<code>A101</code>は売上と更新日時が違います。</p>
<p><code>duplicated()</code>は候補をTrue／Falseで<strong>確認</strong>し、<code>drop_duplicates()</code>は条件に合う行を実際に<strong>削除</strong>します。詳しい真偽値の読み方は、<a href="https://pythondatalab.com/pandas-duplicated/">pandas duplicated()の使い方</a>で確認できます。</p>
<h2><span id="toc7">引数なしでは全列が同じ行だけを削除する</span></h2>
<h3><span id="toc8">実行目的</span></h3>
<p>まず、すべての列が一致する完全重複だけを削除します。元データを残すため、結果を<code>exact_clean</code>という別のDataFrameへ代入します。</p>
<pre class="line-numbers language-python"><code class="language-python">exact_clean = orders.drop_duplicates()

display(exact_clean)
print("処理前の行数:", len(orders))
print("処理後の行数:", len(exact_clean))
print("削除した行数:", len(orders) - len(exact_clean))
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
      <th>更新日時</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A100</td>
      <td>ペン</td>
      <td>1200</td>
      <td>2026-09-01 09:00:00</td>
    </tr>
    <tr>
      <td>1</td>
      <td>A101</td>
      <td>ノート</td>
      <td>800</td>
      <td>2026-09-01 10:00:00</td>
    </tr>
    <tr>
      <td>3</td>
      <td>A102</td>
      <td>ファイル</td>
      <td>500</td>
      <td>2026-09-02 11:00:00</td>
    </tr>
    <tr>
      <td>4</td>
      <td>A101</td>
      <td>ノート</td>
      <td>900</td>
      <td>2026-09-03 15:00:00</td>
    </tr>
    <tr>
      <td>5</td>
      <td>A103</td>
      <td>消しゴム</td>
      <td>300</td>
      <td>2026-09-03 16:00:00</td>
    </tr>
    <tr>
      <td>6</td>
      <td>A104</td>
      <td>ペン</td>
      <td>600</td>
      <td>2026-09-04 10:00:00</td>
    </tr>
  </tbody>
</table>
</div>
<pre class="colab-output">処理前の行数: 8
処理後の行数: 6
削除した行数: 2</pre>
<p>8行から6行になり、完全に同じ<code>A100</code>と<code>A104</code>の2行目が削除されます。一方、<code>A101</code>は売上と更新日時が異なるため2行とも残ります。</p>
<p><strong>「注文IDが同じなら1行にしたい」場合、引数なしでは目的を達成できません。</strong> 次に<code>subset</code>で判定列を指定します。</p>
<h2><span id="toc9">subsetで重複を判定する列を選ぶ</span></h2>
<p><code>subset</code>には列名を1つ、または列名のリストを指定できます。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>指定</th>
        <th>重複とみなす条件</th>
        <th>このデータでの意味</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>指定なし</td>
        <td>全列が一致</td>
        <td>完全なコピー行だけを削除</td>
      </tr>
      <tr>
        <td><code>subset='注文ID'</code></td>
        <td>注文IDが一致</td>
        <td>1注文を1行にする</td>
      </tr>
      <tr>
        <td><code>subset=['注文ID', '商品']</code></td>
        <td>注文IDと商品が両方一致</td>
        <td>注文と商品単位で1行にする</td>
      </tr>
    </tbody>
  </table>
</div>
<p>実データでは、注文IDが「注文全体」を表すのか「注文明細」を表すのかを確認してください。1つの注文IDに複数商品が正しく含まれるデータで<code>subset='注文ID'</code>を使うと、必要な明細まで消してしまいます。</p>
<h3><span id="toc10">実行目的</span></h3>
<p>注文IDを同一レコードの基準として、各注文を1行にします。まずはデフォルトの<code>keep='first'</code>で先頭行を残します。</p>
<pre class="line-numbers language-python"><code class="language-python">first_clean = orders.drop_duplicates(subset="注文ID", keep="first")
display(first_clean)
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
      <th>更新日時</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A100</td>
      <td>ペン</td>
      <td>1200</td>
      <td>2026-09-01 09:00:00</td>
    </tr>
    <tr>
      <td>1</td>
      <td>A101</td>
      <td>ノート</td>
      <td>800</td>
      <td>2026-09-01 10:00:00</td>
    </tr>
    <tr>
      <td>3</td>
      <td>A102</td>
      <td>ファイル</td>
      <td>500</td>
      <td>2026-09-02 11:00:00</td>
    </tr>
    <tr>
      <td>5</td>
      <td>A103</td>
      <td>消しゴム</td>
      <td>300</td>
      <td>2026-09-03 16:00:00</td>
    </tr>
    <tr>
      <td>6</td>
      <td>A104</td>
      <td>ペン</td>
      <td>600</td>
      <td>2026-09-04 10:00:00</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>A101</code>は先に現れた売上800の行が残ります。コードは正常に動いていますが、更新後の売上900を残したい場合には誤った結果です。<code>first</code>は「正しい行」ではなく、<strong>現在の並び順で最初の行</strong>を意味します。</p>
<h2><span id="toc11">複数列の組み合わせで重複を判定する</span></h2>
<p>注文IDだけで判定すると、1つの注文に含まれる別の商品まで削除することがあります。注文明細を商品単位で残す場合は、<code>subset</code>へ複数の列をリストで指定します。</p>
<pre class="line-numbers language-python"><code class="language-python">detail_orders = pd.DataFrame({
    "注文ID": ["A300", "A300", "A300", "A301"],
    "商品": ["ペン", "ノート", "ペン", "ファイル"],
    "売上": [200, 500, 200, 800]
})

order_only = detail_orders.drop_duplicates(subset="注文ID")
order_and_product = detail_orders.drop_duplicates(
    subset=["注文ID", "商品"],
    keep="first",
    ignore_index=True
)

print("処理前")
display(detail_orders)
print("注文IDだけで判定した結果")
display(order_only)
print("注文IDと商品で判定した結果")
display(order_and_product)
</code></pre>
<pre class="colab-output">処理前</pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A300</td>
      <td>ペン</td>
      <td>200</td>
    </tr>
    <tr>
      <td>1</td>
      <td>A300</td>
      <td>ノート</td>
      <td>500</td>
    </tr>
    <tr>
      <td>2</td>
      <td>A300</td>
      <td>ペン</td>
      <td>200</td>
    </tr>
    <tr>
      <td>3</td>
      <td>A301</td>
      <td>ファイル</td>
      <td>800</td>
    </tr>
  </tbody>
</table>
</div>
<pre class="colab-output">注文IDだけで判定した結果</pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A300</td>
      <td>ペン</td>
      <td>200</td>
    </tr>
    <tr>
      <td>3</td>
      <td>A301</td>
      <td>ファイル</td>
      <td>800</td>
    </tr>
  </tbody>
</table>
</div>
<pre class="colab-output">注文IDと商品で判定した結果</pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A300</td>
      <td>ペン</td>
      <td>200</td>
    </tr>
    <tr>
      <td>1</td>
      <td>A300</td>
      <td>ノート</td>
      <td>500</td>
    </tr>
    <tr>
      <td>2</td>
      <td>A301</td>
      <td>ファイル</td>
      <td>800</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>subset="注文ID"</code>では、注文<code>A300</code>の最初の「ペン」だけが残り、正しい明細である「ノート」まで消えます。<code>subset=["注文ID", "商品"]</code>では、注文IDと商品の組み合わせが同じ「ペン」の重複だけを削除し、「ノート」は残ります。</p>
<p>この結果から、<code>subset</code>は列数を増やせば安全になるのではなく、<strong>データの1行が何を表すかに合わせて選ぶ</strong>必要があると分かります。</p>
<h2><span id="toc12">keepで残す行を選ぶ</span></h2>
<p>同じ入力データで<code>keep</code>だけを変え、残る行を比較します。</p>
<h3><span id="toc13">実行目的</span></h3>
<p><code>first</code>・<code>last</code>・<code>False</code>の結果から、<code>A101</code>と重複グループ全体がどう変わるかを確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">keep_first = orders.drop_duplicates(subset="注文ID", keep="first")
keep_last = orders.drop_duplicates(subset="注文ID", keep="last")
keep_none = orders.drop_duplicates(subset="注文ID", keep=False)

comparison = pd.DataFrame({
    "設定": ["first", "last", "False"],
    "残る注文ID": [
        keep_first["注文ID"].tolist(),
        keep_last["注文ID"].tolist(),
        keep_none["注文ID"].tolist()
    ],
    "A101で残る売上": [
        keep_first.loc[keep_first["注文ID"].eq("A101"), "売上"].tolist(),
        keep_last.loc[keep_last["注文ID"].eq("A101"), "売上"].tolist(),
        keep_none.loc[keep_none["注文ID"].eq("A101"), "売上"].tolist()
    ]
})

display(comparison)
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>設定</th>
      <th>残る注文ID</th>
      <th>A101で残る売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>first</td>
      <td>[A100, A101, A102, A103, A104]</td>
      <td>[800]</td>
    </tr>
    <tr>
      <td>1</td>
      <td>last</td>
      <td>[A100, A102, A101, A103, A104]</td>
      <td>[900]</td>
    </tr>
    <tr>
      <td>2</td>
      <td>False</td>
      <td>[A102, A103]</td>
      <td>[]</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>first</code>では<code>A101</code>の800、<code>last</code>では900が残ります。<code>False</code>では重複した<code>A100</code>・<code>A101</code>・<code>A104</code>が全行消え、重複しない<code>A102</code>・<code>A103</code>だけが残ります。</p>
<p><code>keep=False</code>は「2行目以降を削除」ではありません。<strong>重複グループを1行も残さない</strong>指定です。重複データを保留用に分ける場合には使えますが、各注文を1行残したい処理では選びません。</p>
<h2><span id="toc14">最新の行を残すなら更新日時で並べてからkeep=&#8217;last&#8217;を使う</span></h2>
<p><code>keep='last'</code>の<code>last</code>は、時間的に最新という意味ではなく、現在の行順で最後という意味です。更新日時が文字列のまま、またはデータが順不同のままでは、古い記録を残す可能性があります。</p>
<h3><span id="toc15">実行目的</span></h3>
<p>更新日時を日時型にしたことを確認し、注文IDと更新日時で並べた後、注文ごとの最新行を残します。</p>
<pre class="line-numbers language-python"><code class="language-python">print("更新日時のdtype:", orders["更新日時"].dtype)
print("更新日時の欠損数:", orders["更新日時"].isna().sum())

orders_sorted = orders.sort_values(["注文ID", "更新日時"])
latest_orders = orders_sorted.drop_duplicates(
    subset="注文ID",
    keep="last",
    ignore_index=True
)

display(latest_orders)
</code></pre>
<pre class="colab-output">更新日時のdtype: datetime64[ns]
更新日時の欠損数: 0</pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>売上</th>
      <th>更新日時</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>A100</td>
      <td>ペン</td>
      <td>1200</td>
      <td>2026-09-01 09:00:00</td>
    </tr>
    <tr>
      <td>1</td>
      <td>A101</td>
      <td>ノート</td>
      <td>900</td>
      <td>2026-09-03 15:00:00</td>
    </tr>
    <tr>
      <td>2</td>
      <td>A102</td>
      <td>ファイル</td>
      <td>500</td>
      <td>2026-09-02 11:00:00</td>
    </tr>
    <tr>
      <td>3</td>
      <td>A103</td>
      <td>消しゴム</td>
      <td>300</td>
      <td>2026-09-03 16:00:00</td>
    </tr>
    <tr>
      <td>4</td>
      <td>A104</td>
      <td>ペン</td>
      <td>600</td>
      <td>2026-09-04 10:00:00</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>A101</code>では更新日時が新しい売上900の行が残ります。<code>ignore_index=True</code>により、削除後のインデックスは0から4へ振り直されます。これは重複判定を変える指定ではなく、結果のインデックスを整える指定です。</p>
<p>更新日時に欠損がある場合や、どの記録が正しいか判断できない場合は、自動削除しないでください。日付文字列の変換方法は、<a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方</a>で確認できます。</p>
<h2><span id="toc16">削除後は行数・残った値・重複件数を検算する</span></h2>
<h3><span id="toc17">実行目的</span></h3>
<p>「エラーが出なかった」だけで終わらせず、削除行数、残った<code>A101</code>の売上、残存する注文ID重複を確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">before_rows = len(orders)
after_rows = len(latest_orders)
removed_rows = before_rows - after_rows
remaining_duplicates = latest_orders.duplicated(
    subset="注文ID", keep=False
).sum()
a101_sales = latest_orders.loc[
    latest_orders["注文ID"].eq("A101"), "売上"
].iloc[0]

validation = pd.DataFrame({
    "確認項目": ["処理前の行数", "削除した行数", "処理後の行数", "残存する重複行数", "A101で残った売上"],
    "結果": [before_rows, removed_rows, after_rows, remaining_duplicates, a101_sales]
})

display(validation)
print("行数の式が一致:", before_rows - removed_rows == after_rows)
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>確認項目</th>
      <th>結果</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>処理前の行数</td>
      <td>8</td>
    </tr>
    <tr>
      <td>1</td>
      <td>削除した行数</td>
      <td>3</td>
    </tr>
    <tr>
      <td>2</td>
      <td>処理後の行数</td>
      <td>5</td>
    </tr>
    <tr>
      <td>3</td>
      <td>残存する重複行数</td>
      <td>0</td>
    </tr>
    <tr>
      <td>4</td>
      <td>A101で残った売上</td>
      <td>900</td>
    </tr>
  </tbody>
</table>
</div>
<pre class="colab-output">行数の式が一致: True</pre>
<p>処理前8行から3行を削除し、処理後は5行です。注文IDの残存重複行数は0、<code>A101</code>で残った売上は900です。行数の式も<code>True</code>になっています。</p>
<p>ただし、重複数が0でも判定列が正しいとは限りません。最終的には「注文IDだけで1レコードを表せるか」をデータの意味から確認してください。</p>
<h2><span id="toc18">よくある失敗を現象から確認・修正する</span></h2>
<h3><span id="toc19">重複が消えない</span></h3>
<ul>
  <li><strong>現象</strong>：見た目は同じ値なのに、<code>drop_duplicates()</code>後も複数行が残る</li>
  <li><strong>主な原因</strong>：前後空白、大文字・小文字、数値と文字列の型違い、<code>subset</code>の指定違い</li>
  <li><strong>確認方法</strong>：<code>df.dtypes</code>、<code>df.columns.tolist()</code>、<code>repr()</code>相当の表示、<code>duplicated(subset=..., keep=False)</code>で候補を確認する</li>
  <li><strong>修正方法</strong>：必要な列だけ空白・表記・型をそろえ、同じ<code>subset</code>で再確認してから削除する</li>
  <li><strong>修正後の確認</strong>：削除後に同じ<code>subset</code>で<code>duplicated(keep=False).sum()</code>が想定件数になったか確認する</li>
</ul>
<h3><span id="toc20">必要な行まで消えた</span></h3>
<ul>
  <li><strong>現象</strong>：正しい注文明細や異なる観測まで削除された</li>
  <li><strong>主な原因</strong>：<code>subset</code>が粗すぎる、または<code>keep=False</code>を使った</li>
  <li><strong>確認方法</strong>：削除前データから重複候補を全件表示し、判定列以外の値を比較する</li>
  <li><strong>修正方法</strong>：商品・明細番号など必要な列を<code>subset</code>へ追加する。各グループを1行残すなら<code>first</code>または<code>last</code>を選ぶ</li>
  <li><strong>修正後の確認</strong>：削除した行と残った行を注文IDごとに照合する</li>
</ul>
<h3><span id="toc21">最新ではない行が残った</span></h3>
<ul>
  <li><strong>現象</strong>：<code>keep='last'</code>を使ったのに古い値が残る</li>
  <li><strong>主な原因</strong>：<code>last</code>を「最新」と誤解し、更新日時で並べていない</li>
  <li><strong>確認方法</strong>：更新日時のdtype、欠損数、並び順を表示する</li>
  <li><strong>修正方法</strong>：<code>to_datetime()</code>で日時型へ変換し、更新日時で並べてから<code>keep='last'</code>を実行する</li>
  <li><strong>修正後の確認</strong>：重複していたIDの更新日時と残った値を個別に確認する</li>
</ul>
<h3><span id="toc22">元のDataFrameへ反映されない</span></h3>
<ul>
  <li><strong>現象</strong>：メソッドを実行した後も元の行数が変わらない</li>
  <li><strong>主な原因</strong>：<code>drop_duplicates()</code>は既定で新しいDataFrameを返し、元データを変更しない</li>
  <li><strong>確認方法</strong>：戻り値を変数へ代入したか確認する</li>
  <li><strong>修正方法</strong>：<code>clean_df = df.drop_duplicates(...)</code>のように別変数へ代入する</li>
  <li><strong>修正後の確認</strong>：<code>len(df)</code>と<code>len(clean_df)</code>を比較する</li>
</ul>
<p><code>inplace=True</code>でも変更できますが、初心者は元データと処理後データを比較できるよう、まず別変数への代入をおすすめします。</p>
<h2><span id="toc23">NaNを含む判定列は削除前に意味を確認する</span></h2>
<p>欠損した注文IDが複数あると、それらが重複候補として扱われる場合があります。しかし「注文ID不明」が同じ注文を意味するとは限りません。実際の挙動を確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">missing_id_sample = pd.DataFrame({
    "注文ID": [None, None, "A200"],
    "商品": ["ペン", "ノート", "ファイル"]
})

missing_id_sample["重複候補"] = missing_id_sample.duplicated(
    subset="注文ID", keep=False
)
display(missing_id_sample)
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>注文ID</th>
      <th>商品</th>
      <th>重複候補</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>None</td>
      <td>ペン</td>
      <td>True</td>
    </tr>
    <tr>
      <td>1</td>
      <td>None</td>
      <td>ノート</td>
      <td>True</td>
    </tr>
    <tr>
      <td>2</td>
      <td>A200</td>
      <td>ファイル</td>
      <td>False</td>
    </tr>
  </tbody>
</table>
</div>
<p>2つの欠損した注文IDは重複候補になります。ただし、商品が異なるため、同一注文と断定して削除すると情報を失うおそれがあります。判定列に欠損がある場合は、欠損行を別に確認し、補完・保持・除外の方針を決めてください。欠損行の削除は重複行削除とは別の処理です。詳しくは<a href="https://pythondatalab.com/pandas-drop/">Pandas dropna()の使い方</a>を参照してください。</p>
<h2><span id="toc24">自分のDataFrameへ置き換える前のチェックリスト</span></h2>
<ul>
  <li><code>subset</code>に指定する列は、業務上の同一レコードを表しているか</li>
  <li>1つのIDに複数明細が存在してよいデータではないか</li>
  <li>残す行を決める更新日時・状態・優先順位の列があるか</li>
  <li>更新日時は日時型か、欠損していないか、正しく並んでいるか</li>
  <li>判定列に前後空白、表記ゆれ、型違い、NaNがないか</li>
  <li>元DataFrameを残し、処理後を別変数へ保存したか</li>
  <li>削除前後の行数、残った値、残存重複数を確認したか</li>
  <li>集計値が想定外に減っていないか</li>
</ul>
<p>判断根拠がない重複候補は、削除せず別DataFrameへ取り出して確認してください。</p>
<h2><span id="toc25">重複を削除したデータを集計へつなげる</span></h2>
<h3><span id="toc26">実行目的</span></h3>
<p>重複除去後の注文データを商品別に集計し、二重計上のない件数と売上合計を確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">product_summary = (
    latest_orders.groupby("商品", as_index=False)
    .agg(注文件数=("注文ID", "count"), 売上合計=("売上", "sum"))
    .sort_values("売上合計", ascending=False, ignore_index=True)
)

display(product_summary)
print("集計した注文件数:", product_summary["注文件数"].sum())
print("重複除去後の売上合計:", product_summary["売上合計"].sum())
</code></pre>
<div class="table-scroll">
<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>商品</th>
      <th>注文件数</th>
      <th>売上合計</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>ペン</td>
      <td>2</td>
      <td>1800</td>
    </tr>
    <tr>
      <td>1</td>
      <td>ノート</td>
      <td>1</td>
      <td>900</td>
    </tr>
    <tr>
      <td>2</td>
      <td>ファイル</td>
      <td>1</td>
      <td>500</td>
    </tr>
    <tr>
      <td>3</td>
      <td>消しゴム</td>
      <td>1</td>
      <td>300</td>
    </tr>
  </tbody>
</table>
</div>
<pre class="colab-output">集計した注文件数: 5
重複除去後の売上合計: 3500</pre>
<p>集計した注文件数は5件、売上合計は3,500です。<code>latest_orders</code>の5行と件数が一致します。重複削除後は、件数だけでなく合計値も確認すると、削除しすぎや二重計上に気づきやすくなります。</p>
<p>複数列・複数集計へ進む場合は、<a href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方</a>を参照してください。</p>
<h2><span id="toc27">まとめ</span></h2>
<ul>
  <li><code>drop_duplicates()</code>の前に<code>duplicated(keep=False)</code>で重複候補を確認する</li>
  <li><code>subset</code>は「何を同一レコードとみなすか」で選ぶ</li>
  <li><code>keep</code>は「どの記録を正として残すか」で選ぶ</li>
  <li>最新行を残す場合は、更新日時を日時型へ変換し、並べてから<code>keep='last'</code>を使う</li>
  <li><code>keep=False</code>は重複グループを全行削除するため、目的を確認して使う</li>
  <li>削除後は行数、残った値、残存重複数、集計値を検算する</li>
  <li>判断できない候補は自動削除せず、元データを残して確認する</li>
</ul>
<p>重複削除の目的は、単に行数を減らすことではありません。分析に使う正しい観測単位を決め、集計の二重計上や必要データの消失を防ぐことです。</p>
<h2><span id="toc28">関連記事</span></h2>
<ul>
  <li><a href="https://pythondatalab.com/pandas-duplicated/">pandas duplicated()の使い方｜重複行の確認・subset・keepを初心者向けに解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-preprocessing-basic/">Pandasデータ前処理の基本｜読み込み後に確認する順番と欠損・型・重複の選び方</a></li>
  <li><a href="https://pythondatalab.com/pandas-drop/">Pandas dropna()の使い方</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-reset-index/">pandas reset_index()の使い方｜インデックスを振り直す・drop=Trueを解説</a></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="toc29"> カテゴリから探す</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-1789141189292" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">drop_duplicates()とduplicated()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>duplicated()</code>は重複候補をTrue／Falseで確認するメソッド、<code>drop_duplicates()</code>は重複行を除いたDataFrameを返すメソッドです。安全に処理するには、先に<code>duplicated(keep=False)</code>で全候補を表示してから削除します。</p>

</div>
</div>
<div id="faq-question-1789141250765" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">複数列が同じ行だけを削除するにはどうしますか？</span></h3>
<div class="rank-math-answer ">

<p><code>subset=['注文ID', '商品']</code>のように列名をリストで指定します。指定した列がすべて同じ行が重複と判定されます。列を増やす前に、それらが業務上の同一レコードを表すか確認してください。</p>

</div>
</div>
<div id="faq-question-1789141259683" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">最新の行だけを残すにはどうしますか？</span></h3>
<div class="rank-math-answer ">

<p>更新日時を日時型へ変換し、古い順に並べてから<code>keep='last'</code>を使います。<code>last</code>は現在の行順で最後という意味なので、並べ替えずに使っても最新行が残るとは限りません。</p>

</div>
</div>
<div id="faq-question-1789141272385" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc33">実行しても元のDataFrameが変わらないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>drop_duplicates()</code>は既定で新しいDataFrameを返すためです。<code>clean_df = df.drop_duplicates(...)</code>のように戻り値を代入してください。元データを残せるため、処理前後の比較もしやすくなります。</p>

</div>
</div>
<div id="faq-question-1789141284187" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc34">NaNを含む行はどう判定されますか？</span></h3>
<div class="rank-math-answer ">

<p>判定列で欠損値が重なる行は重複候補になり得ます。ただし、欠損値同士が同じ実体を示すとは限りません。削除前に欠損行を表示し、同一レコードとして扱ってよいかデータの意味から判断してください。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-drop-duplicates/">pandas drop_duplicates()の使い方｜subset・keepで重複行を削除</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-drop-duplicates/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pandasデータ前処理の基本｜読み込み後に確認する順番と欠損・型・重複の選び方</title>
		<link>https://pythondatalab.com/pandas-preprocessing-basic/</link>
					<comments>https://pythondatalab.com/pandas-preprocessing-basic/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 06 Sep 2026 08:12:27 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2190</guid>

					<description><![CDATA[<p>Pandasでデータ読み込み後に行う前処理の手順を解説。一律に処理するのではなく、info()での診断から空白除去、to_numeric()/astype()での型変換、欠損値・重複の判断、集計への進み方まで「確認→選択→再確認」の流れで網羅します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-preprocessing-basic/">Pandasデータ前処理の基本｜読み込み後に確認する順番と欠損・型・重複の選び方</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.line-numbers,.colab-article pre.colab-output{margin-top:0!important;margin-bottom:0!important;padding:1em}
  .colab-article .table-scroll{overflow-x:auto;margin:0}
  /* テーブル全体の枠線スタイルを追加 */
  .colab-article table.wp-block-table{width:auto;border-collapse:collapse;border:1px solid #ccc}
  /* ヘッダーとセルの枠線・パディング・背景色を追加 */
  .colab-article table.wp-block-table th,.colab-article table.wp-block-table td{white-space:nowrap;padding:.4em .8em;border:1px solid #ccc}
  .colab-article table.wp-block-table th{background-color:#f2f2f2}
  .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>CSVやExcelを読み込んだ後、すぐに欠損値を埋めたり行を削除したりしていませんか。Pandasのデータ前処理で大切なのは、決まった処理をすべて行うことではありません。<strong>DataFrameの状態を確認し、問題がある列だけを直して、処理後にもう一度確認すること</strong>です。</p>
  <p>この記事では、Google Colabでそのまま実行できる小さな売上データを使い、分析前の確認から空白・型・欠損値・重複候補の判断、集計へ進むまでの流れを解説します。</p>
  
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-3" checked><label class="toc-title" for="toc-checkbox-3">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：前処理は「確認→選択→再確認」で進めます</a></li><li><a href="#toc3" tabindex="0">1. 実行前のデータを用意する</a></li><li><a href="#toc4" tabindex="0">2. まずinfo()で列・型・欠損値を診断する</a></li><li><a href="#toc5" tabindex="0">3. 空白と数値文字列を、対象列だけ整える</a></li><li><a href="#toc6" tabindex="0">4. 欠損値は「何を意味するか」で選ぶ</a></li><li><a href="#toc7" tabindex="0">5. 重複候補は、削除する前に判定列を決める</a></li><li><a href="#toc8" tabindex="0">6. 処理後の状態を再確認して集計へ進む</a></li><li><a href="#toc9" tabindex="0">7. 整えたデータを集計へつなげる</a></li><li><a href="#toc10" tabindex="0">まとめ</a></li><li><a href="#toc11" tabindex="0">関連記事</a><ol><li><a href="#toc12" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc13" tabindex="0">欠損値はすべて埋めるべきですか？</a></li><li><a href="#toc14" tabindex="0">to_numeric()とastype()はどちらを使えばよいですか？</a></li><li><a href="#toc15" tabindex="0">重複行はすぐに削除してよいですか？</a></li><li><a href="#toc16" tabindex="0">どこまで確認したら集計へ進めますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2><ul><li>読み込み後に最初に確認する項目</li><li>空白、数値文字列、欠損値、重複候補の見分け方</li><li><code>to_numeric()</code>・<code>astype()</code>、<code>fillna()</code>・<code>dropna()</code>を選ぶ基準</li><li>前処理後に集計・可視化へ進む目安</li></ul>
  <h2><span id="toc2">先に結論：前処理は「確認→選択→再確認」で進めます</span></h2>
  <p>読み込み直後に行うことは、データを一律にきれいにすることではありません。まず<code>info()</code>で状態を確認し、問題がある列だけを処理します。</p>
  <div class="table-scroll"><table class="wp-block-table"><thead><tr><th>確認で見つかった状態</th><th>選ぶ処理</th><th>処理しない判断</th><th>処理後に確認する項目</th></tr></thead><tbody><tr><td>前後空白がある</td><td><code>str.strip()</code></td><td>空白に意味がある場合</td><td>値がそろったか</td></tr><tr><td>数値列が文字列</td><td><code>to_numeric()</code></td><td>IDなど文字列で保持すべき列</td><td>dtypeと変換後のNaN</td></tr><tr><td>欠損値がある</td><td>保持・<code>fillna()</code>・<code>dropna()</code></td><td>欠損が重要な情報の場合</td><td>件数、補完値、行数</td></tr><tr><td>重複候補がある</td><td><code>duplicated()</code>で確認</td><td>判定列や残す基準が未確定</td><td>候補行と行数</td></tr></tbody></table></div>
  <h2><span id="toc3">1. 実行前のデータを用意する</span></h2><p>商品名の前後空白、数値ではない売上、欠損した担当者、重複候補の注文IDを持つ店舗売上データです。実データでも、元データを残して作業用のDataFrameを作ると安全です。</p>
  <pre class="line-numbers language-python"><code class="language-python">import pandas as pd
from IPython.display import display

raw_df = pd.DataFrame({
    '注文ID': [1001, 1002, 1002, 1003, 1004],
    '商品名': [' ノート ', 'ペン', 'ペン', 'ノート', '消しゴム'],
    '売上': ['1200', '不明', '1500', '900', ''],
    '購入日': ['2026-09-01', '2026-09-01', '2026-09-01', '2026-09-02', '2026-09-02'],
    '担当者': ['佐藤', None, None, '田中', '鈴木']
})
df = raw_df.copy()
display(df)</code></pre>
  <h2><span id="toc4">2. まずinfo()で列・型・欠損値を診断する</span></h2><p><strong>実行目的</strong>：行数、列名、データ型、欠損値がある列を一度に確認します。<strong>出力で見る場所</strong>：<code>Non-Null Count</code>が行数より少ない列は欠損を含みます。見た目が数字でも<code>object</code>型の<code>売上</code>は、計算前に内容を確認します。</p>
  <pre class="line-numbers language-python"><code class="language-python">print('行数・列数:', df.shape)
print('
列名:', df.columns.tolist())
print('
--- df.info() の出力 ---')
df.info()
print('
列ごとの欠損数:')
display(df.isna().sum().rename('欠損数').to_frame())</code></pre>
  <p>この例では<code>担当者</code>に2件の欠損があります。一方、<code>売上</code>の空文字はまだ欠損値として数えられません。詳しい読み方は<a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a>を参照してください。</p>
  <h2><span id="toc5">3. 空白と数値文字列を、対象列だけ整える</span></h2><p>商品名の前後空白を除き、売上を計算できる数値へ変換します。<code>不明</code>や空文字は0円とは限らないため、0を入れず、数値に変換できない値を<code>NaN</code>として確認します。</p>
  <pre class="line-numbers language-python"><code class="language-python">df['商品名_clean'] = df['商品名'].str.strip()
df['売上_数値'] = pd.to_numeric(df['売上'], errors='coerce')

display(df[['商品名', '商品名_clean', '売上', '売上_数値']])
print('売上_数値のdtype:', df['売上_数値'].dtype)
print('売上_数値の欠損数:', df['売上_数値'].isna().sum())

sales_problem_rows = df.loc[df['売上_数値'].isna(), ['注文ID', '売上', '売上_数値']]
display(sales_problem_rows)</code></pre>
  <p><strong>結果の読み方</strong>：<code> ノート </code>は<code>ノート</code>にそろい、<code>不明</code>と空文字は<code>NaN</code>になります。<code>errors='coerce'</code>はコードが止まらない一方、変換に失敗した元の値を必ず確認する必要があります。</p>
  <p>数値以外の文字が混ざる可能性があるなら<code>to_numeric()</code>、すでに正しい値を目的の型へそろえるなら<code>astype()</code>が目安です。IDや郵便番号のように文字そのものに意味がある列は数値化しません。詳しくは<a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>、<a href="https://pythondatalab.com/pandas-astype/">pandas astype()の使い方</a>を参照してください。</p>
  <h2><span id="toc6">4. 欠損値は「何を意味するか」で選ぶ</span></h2><p><code>担当者</code>の欠損は未確認であることを明示する文字列に置き換えます。一方、売上の<code>NaN</code>を0にすると、未確認の売上を0円と誤解させるため補完しません。</p>
  <pre class="line-numbers language-python"><code class="language-python">df['担当者_clean'] = df['担当者'].fillna('担当者未確認')
display(df[['注文ID', '担当者', '担当者_clean', '売上', '売上_数値']])
print('担当者_cleanの欠損数:', df['担当者_clean'].isna().sum())
print('売上_数値の欠損数:', df['売上_数値'].isna().sum())</code></pre>
  <p><strong>注意</strong>：<code>fillna(0)</code>を売上へ使うと、未確認の売上が集計へ混ざります。反対に<code>dropna()</code>で行を削除すると、担当者だけが欠損した売上まで失う可能性があります。欠損の列・意味・件数を見てから選んでください。<a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方</a>、<a href="https://pythondatalab.com/pandas-drop/">Pandas dropna()・drop_duplicates()の使い方</a>も参照してください。</p>
  <h2><span id="toc7">5. 重複候補は、削除する前に判定列を決める</span></h2><p><code>注文ID</code>が1002の行は2つあります。ただし売上が異なるため、二重登録か修正履歴かは確定できません。まず候補を表示し、何を同一観測とみなすかを決めます。</p>
  <pre class="line-numbers language-python"><code class="language-python">duplicate_order_rows = df.loc[
    df.duplicated(subset=['注文ID'], keep=False),
    ['注文ID', '商品名_clean', '売上', '売上_数値', '購入日']
]
display(duplicate_order_rows)
print('注文IDが重複している候補行数:', len(duplicate_order_rows))</code></pre>
  <p>ここでは削除しません。更新日時・明細番号・取消区分などを確認してから、<code>drop_duplicates()</code>の対象列と<code>keep</code>を選びます。詳しくは<a href="https://pythondatalab.com/pandas-duplicated/">pandas duplicated()の使い方</a>を参照してください。</p>
  <h2><span id="toc8">6. 処理後の状態を再確認して集計へ進む</span></h2><p>今回は売上が数値として確認できた行だけを別のDataFrameへ取り出します。元データは削除せず、未確認の売上と重複候補は残します。</p>
  <pre class="line-numbers language-python"><code class="language-python">sales_ready = df.loc[df['売上_数値'].notna()].copy()
print('元データの行数:', len(df))
print('売上を集計できる行数:', len(sales_ready))
print('売上を集計できない行数:', df['売上_数値'].isna().sum())
sales_ready.info()
display(sales_ready[['注文ID', '商品名_clean', '売上_数値', '担当者_clean']])</code></pre>
  <p>この例では集計できる行は3行です。集計結果は「数値として確認できた売上」のみであり、未確認の売上は含まれません。この前提を説明できる状態になってから次へ進みます。</p>
  <h2><span id="toc9">7. 整えたデータを集計へつなげる</span></h2>
  <pre class="line-numbers language-python"><code class="language-python">product_sales = (
    sales_ready.groupby('商品名_clean', as_index=False)['売上_数値']
    .sum()
    .sort_values('売上_数値', ascending=False)
)
display(product_sales)</code></pre>
  <p>結果は<code>ノート</code>が2,100、<code>ペン</code>が1,500です。ただし未確認の売上は含みません。グループ別集計は<a href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方</a>へ進んでください。日付ごとに分析したい場合は<code>to_datetime()</code>と<code>.dt</code>、<code>resample()</code>を使います。</p>
  <h2><span id="toc10">まとめ</span></h2><ul><li><code>info()</code>で列・型・欠損を確認する。</li><li>空白、型、欠損、重複のうち問題があるものだけを処理する。</li><li>元の値、行数、欠損数、dtypeを処理後に再確認する。</li><li>前提を理解したうえで集計・可視化へ進む。</li></ul>
  <h2><span id="toc11">関連記事</span></h2><ul><li><a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a></li><li><a href="https://pythondatalab.com/pandas-str-strip/">pandas str.strip()の使い方</a></li><li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a></li><li><a href="https://pythondatalab.com/pandas-astype/">pandas astype()の使い方</a></li><li><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方</a></li><li><a href="https://pythondatalab.com/pandas-drop/">Pandas dropna()・drop_duplicates()の使い方</a></li><li><a href="https://pythondatalab.com/pandas-duplicated/">pandas duplicated()の使い方</a></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="toc12"> カテゴリから探す</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-1788682065511" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc13">欠損値はすべて埋めるべきですか？</span></h3>
<div class="rank-math-answer ">

<p>いいえ。欠損が何を意味するか、補完すると集計や判断がどう変わるかで決めます。</p>

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

<p>変換できない値を確認したい場合は<code>to_numeric()</code>、正しい値を目的のdtypeへそろえる場合は<code>astype()</code>が目安です。</p>

</div>
</div>
<div id="faq-question-1788682094082" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc15">重複行はすぐに削除してよいですか？</span></h3>
<div class="rank-math-answer ">

<p>いいえ。何を同一観測とみなすかを先に決め、<code>duplicated(..., keep=False)</code>で候補を確認してから判断します。</p>

</div>
</div>
<div id="faq-question-1788682108281" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc16">どこまで確認したら集計へ進めますか？</span></h3>
<div class="rank-math-answer ">

<p>集計に使う列の型、欠損値、対象外にした行数、重複候補の扱いを説明できる状態になったら進みます。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-preprocessing-basic/">Pandasデータ前処理の基本｜読み込み後に確認する順番と欠損・型・重複の選び方</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-preprocessing-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas explode()の使い方｜リスト列を複数行に展開する方法</title>
		<link>https://pythondatalab.com/pandas-explode/</link>
					<comments>https://pythondatalab.com/pandas-explode/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Thu, 03 Sep 2026 12:17:18 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2173</guid>

					<description><![CDATA[<p>pandasのexplode()でリスト形式の列を複数行に展開する方法を初心者向けに解説。ignore_index、文字列の分割、複数列、空リスト・NaN、ValueErrorの原因と修正、展開後の集計まで実例で学べます。<br />
パーマリンク</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-explode/">pandas explode()の使い方｜リスト列を複数行に展開する方法</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 .code-toolbar {
      margin: 1em 0;
    }
    .colab-article .code-toolbar pre[class*="language-"] {
      margin: 0 !important;
    }
    .colab-article .colab-output {
      margin: 0.75em 0 1.25em;
      padding: 0.8em 1em;
      overflow-x: auto;
      color: #222;
      background: #f6f7f7;
      border: 1px solid #dcdcde;
      white-space: pre;
    }
    .colab-article table.wp-block-table th,
    .colab-article table.wp-block-table td {
      border: 1px solid #dcdcde;
      text-align: left;
    }
    .colab-article table.wp-block-table thead th {
      background: #f0f0f1;
      font-weight: 700;
    }
  </style>

<p>アンケートの複数回答や商品タグのように、<strong>1つのセルに複数の値が入っていて、要素ごとに集計できない</strong>ことがあります。</p>

<p>セルの値がリスト形式なら、<code>pandas</code>の<code>explode()</code>を使うと、リストの各要素を1行ずつに展開できます。</p>

<pre class="line-numbers"><code class="language-python">df.explode("列名", ignore_index=True)</code></pre>

<p>ただし、カンマ区切りの文字列はそのままでは分割されません。また、展開後は行数が増え、指定していない列の値も繰り返されます。この記事では、コードを動かすだけでなく、<strong>行数・インデックス・空リスト・欠損値を確認し、集計結果が正しいか検算する方法</strong>まで説明します。</p>


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">最初に確認：何をどの方向へ分けたいか</a></li><li><a href="#toc3" tabindex="0">基本例：複数回答のリストを1要素1行へ展開する</a><ol><li><a href="#toc4" tabindex="0">実行前のデータを確認する</a></li><li><a href="#toc5" tabindex="0">explode()を実行する</a></li><li><a href="#toc6" tabindex="0">ignore_index=Trueで連番にする</a></li></ol></li><li><a href="#toc7" tabindex="0">展開前後の行数を検算する</a></li><li><a href="#toc8" tabindex="0">カンマ区切りの文字列は、先にstr.split()で分割する</a><ol><li><a href="#toc9" tabindex="0">確認方法と修正方法</a></li></ol></li><li><a href="#toc10" tabindex="0">複数列を同時に展開する</a><ol><li><a href="#toc11" tabindex="0">複数列では、行ごとの要素数をそろえる</a></li></ol></li><li><a href="#toc12" tabindex="0">空リスト・NaN・通常の文字列の挙動を確認する</a></li><li><a href="#toc13" tabindex="0">展開後にvalue_counts()で件数を集計する</a></li><li><a href="#toc14" tabindex="0">自分のデータへ置き換えるときのチェックリスト</a></li><li><a href="#toc15" tabindex="0">まとめ</a></li><li><a href="#toc16" tabindex="0">関連記事</a><ol><li><a href="#toc17" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc18" tabindex="0">explode()で文字列が1文字ずつ分かれないのはなぜですか？</a></li><li><a href="#toc19" tabindex="0">複数列を同時に展開するとValueErrorになるのはなぜですか？</a></li><li><a href="#toc20" tabindex="0">展開後にインデックスが重複するのは問題ですか？</a></li><li><a href="#toc21" tabindex="0">空リストとNaNは展開後にどうなりますか？</a></li><li><a href="#toc22" tabindex="0">explode()とmelt()はどう使い分けますか？</a></li><li><a href="#toc23" tabindex="0">展開後の行数が正しいか、どう確認しますか？</a></li></ol></li></ol>
    </div>
  </div>

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

<ul>
<li><code>explode()</code>でリスト形式の列を1要素1行へ展開する方法</li>
<li><code>ignore_index=True</code>を使う場面</li>
<li><code>explode()</code>・<code>str.split()</code>・<code>melt()</code>・横方向展開の選び方</li>
<li>複数列を同時に展開する条件</li>
<li>空リスト、<code>NaN</code>、通常の文字列がどう扱われるか</li>
<li><code>ValueError</code>や想定外の行数が生じたときの確認・修正方法</li>
<li>展開後に<code>value_counts()</code>で件数を集計し、合計を検算する方法</li>
</ul>

<p><code>explode()</code>は、データ確認後、集計や可視化へ進む前にデータの形を整える処理です。</p>

<h2><span id="toc2">最初に確認：何をどの方向へ分けたいか</span></h2>

<p>似た処理でも、入力データと目的によって使う方法が変わります。</p>

<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">方法</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">入力の状態</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">求める結果</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">注意点</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>explode()</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>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>str.split()</code> → <code>explode()</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>"Python,SQL"</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>melt()</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>
</tr>
</tbody>
</table>

</div><p>今回の目的は「セル内の複数回答を、回答1件につき1行へ変える」ことなので、<code>explode()</code>を選びます。なお、リスト要素を横方向の別列へ広げたい場合は<code>apply(pd.Series)</code>などを使いますが、この記事では深入りしません。</p>

<h2><span id="toc3">基本例：複数回答のリストを1要素1行へ展開する</span></h2>

<h3><span id="toc4">実行前のデータを確認する</span></h3>

<p>回答者ID、年代、学びたいテーマを持つアンケートデータを使います。<code>学びたいテーマ</code>列には、文字列ではなくPythonのリストが入っています。</p>

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

survey = pd.DataFrame({
    &quot;回答者ID&quot;: [101, 102, 103],
    &quot;年代&quot;: [&quot;20代&quot;, &quot;30代&quot;, &quot;20代&quot;],
    &quot;学びたいテーマ&quot;: [
        [&quot;Python&quot;, &quot;pandas&quot;],
        [&quot;pandas&quot;, &quot;可視化&quot;, &quot;SQL&quot;],
        [&quot;Python&quot;]
    ]
})

survey</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">101</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">[Python, pandas]</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;">102</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">[pandas, 可視化, SQL]</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;">103</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">[Python]</td>
    </tr>
  </tbody>
</table></div>
<p>実行前は3行です。<code>学びたいテーマ</code>列のリストには、それぞれ2個、3個、1個の要素があります。合計は6個なので、すべてを展開すると6行になるはずです。</p>

<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">101</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>[Python, pandas]</code></td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">102</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>[pandas, 可視化, SQL]</code></td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">103</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>[Python]</code></td>
</tr>
</tbody>
</table>
</div>
<h3><span id="toc5">explode()を実行する</span></h3>

<p>まずは元インデックスを残して展開します。<code>explode()</code>は元のDataFrameを自動で上書きしないため、結果を新しい変数へ代入します。</p>

<pre class="line-numbers"><code class="language-python">survey_long = survey.explode(&quot;学びたいテーマ&quot;)
survey_long</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">101</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</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;">101</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</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;">102</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</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;">102</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</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;">102</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">SQL</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;">103</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</td>
    </tr>
  </tbody>
</table></div>
<p>出力では、次の3点に注目してください。</p>

<ol>
<li><code>学びたいテーマ</code>の各要素が別の行になっています。</li>
<li><code>回答者ID</code>と<code>年代</code>は、展開された各行へ繰り返されています。</li>
<li>左端のインデックスは<code>0, 0, 1, 1, 1, 2</code>となり、元の行番号が保持されています。</li>
</ol>

<p>インデックスの重複は、重複回答が発生したという意味ではありません。<strong>同じ元レコードから展開された行</strong>であることを示しています。</p>

<h3><span id="toc6">ignore_index=Trueで連番にする</span></h3>

<p>元の行番号を残す必要がなく、展開後の行へ<code>0</code>から連番を付けたい場合は、<code>ignore_index=True</code>を指定します。</p>

<pre class="line-numbers"><code class="language-python">survey_long = survey.explode(&quot;学びたいテーマ&quot;, ignore_index=True)
survey_long</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">101</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</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;">101</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</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;">102</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</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;">102</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</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;">102</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">30代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">SQL</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;">103</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">20代</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</td>
    </tr>
  </tbody>
</table></div>
<p><code>学びたいテーマ</code>の内容は同じですが、インデックスが<code>0</code>から<code>5</code>までの連番になりました。</p>

<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">指定</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">展開後のインデックス</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
</tr>
</thead>
<tbody>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>ignore_index=False</code>（初期値）</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">元のインデックスを繰り返す</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">どの元行から展開されたか追跡したい</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>ignore_index=True</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>
</tbody>
</table>

</div><p>すでに<code>ignore_index=False</code>で展開した結果なら、<code>reset_index(drop=True)</code>でも後から連番へ直せます。</p>

<h2><span id="toc7">展開前後の行数を検算する</span></h2>

<p>コードがエラーなく動いても、期待した件数になっているとは限りません。リスト内の要素数を合計し、展開後の行数と比較します。</p>

<pre class="line-numbers"><code class="language-python">expected_rows = survey[&quot;学びたいテーマ&quot;].map(len).sum()
actual_rows = len(survey_long)

print(f&quot;展開前の行数: {len(survey)}&quot;)
print(f&quot;リスト内の要素数合計: {expected_rows}&quot;)
print(f&quot;展開後の行数: {actual_rows}&quot;)
print(f&quot;件数は一致: {expected_rows == actual_rows}&quot;)</code></pre>
<pre class="colab-output">展開前の行数: 3
リスト内の要素数合計: 6
展開後の行数: 6
件数は一致: True</pre>
<p>要素数合計と展開後の行数は、どちらも6です。これで、今回のデータでは回答を欠落・重複させず展開できたと確認できます。</p>

<p>ただし、空リストや<code>NaN</code>を含む場合は、単純な要素数合計と展開後行数が一致しないことがあります。後半で、その理由を確認します。</p>

<h2><span id="toc8">カンマ区切りの文字列は、先にstr.split()で分割する</span></h2>

<p><code>explode()</code>が展開するのは、リストやタプルなどのlist-likeな値です。<code>"Python, pandas"</code>のような通常の文字列を指定しても、カンマや1文字ごとには分かれません。</p>

<p>次のデータで違いを確認します。</p>

<pre class="line-numbers"><code class="language-python">survey_text = pd.DataFrame({
    &quot;回答者ID&quot;: [201, 202],
    &quot;学びたいテーマ&quot;: [&quot;Python, pandas&quot;, &quot;可視化, SQL&quot;]
})

not_split = survey_text.explode(&quot;学びたいテーマ&quot;, ignore_index=True)
not_split</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">201</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python, pandas</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;">202</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">可視化, SQL</td>
    </tr>
  </tbody>
</table></div>
<p>行数は2行のままで、文字列は分割されていません。これはエラーではなく、<code>explode()</code>の仕様どおりの結果です。</p>

<h3><span id="toc9">確認方法と修正方法</span></h3>

<ul>
<li><strong>現象</strong>：<code>explode()</code>を実行しても行が増えない</li>
<li><strong>原因</strong>：セルの値がリストではなく1つの文字列</li>
<li><strong>確認方法</strong>：対象列の値と型を確認する</li>
<li><strong>修正方法</strong>：<code>str.split()</code>でリスト化し、前後空白を除いてから展開する</li>
</ul>

<pre class="line-numbers"><code class="language-python">print(&quot;変換前の値:&quot;, survey_text.loc[0, &quot;学びたいテーマ&quot;])
print(&quot;変換前の型:&quot;, type(survey_text.loc[0, &quot;学びたいテーマ&quot;]).__name__)

survey_text_fixed = survey_text.assign(
    学びたいテーマ=survey_text[&quot;学びたいテーマ&quot;].str.split(&quot;,&quot;)
)

survey_text_fixed[&quot;学びたいテーマ&quot;] = survey_text_fixed[&quot;学びたいテーマ&quot;].map(
    lambda items: [item.strip() for item in items]
)

text_long = survey_text_fixed.explode(&quot;学びたいテーマ&quot;, ignore_index=True)
text_long</code></pre>
<pre class="colab-output">変換前の値: Python, pandas
変換前の型: str</pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">201</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</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;">201</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</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;">202</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;">202</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">SQL</td>
    </tr>
  </tbody>
</table></div>
<p>修正後は4行になり、<code>Python</code>、<code>pandas</code>、<code>可視化</code>、<code>SQL</code>が1行ずつに分かれました。<code>str.split(",")</code>だけでは区切り後の空白が残るため、各要素へ<code>strip()</code>を適用しています。</p>

<p>自分のデータでは、カンマが半角か全角か、セミコロンやパイプで区切られていないかも確認してください。</p>

<h2><span id="toc10">複数列を同時に展開する</span></h2>

<p>複数列の各要素に対応関係がある場合は、列名のリストを渡して同時に展開できます。次の例では、1番目のテーマと1番目の習熟度、2番目どうしが対応しています。</p>

<pre class="line-numbers"><code class="language-python">skills = pd.DataFrame({
    &quot;回答者ID&quot;: [301, 302],
    &quot;学びたいテーマ&quot;: [[&quot;Python&quot;, &quot;pandas&quot;], [&quot;SQL&quot;, &quot;可視化&quot;]],
    &quot;習熟度&quot;: [[&quot;入門&quot;, &quot;初級&quot;], [&quot;初級&quot;, &quot;入門&quot;]]
})

skills_long = skills.explode(
    [&quot;学びたいテーマ&quot;, &quot;習熟度&quot;],
    ignore_index=True
)
skills_long</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">301</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</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;">301</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</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;">302</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">SQL</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;">302</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>結果は4行になり、<code>Python―入門</code>、<code>pandas―初級</code>のように対応関係を保って展開されます。</p>

<h3><span id="toc11">複数列では、行ごとの要素数をそろえる</span></h3>

<p>同時に展開する列は、<strong>各行でリストの長さが一致している必要があります</strong>。長さが違うと<code>ValueError: columns must have matching element counts</code>が発生します。</p>

<pre class="line-numbers"><code class="language-python">skills_error = pd.DataFrame({
    &quot;回答者ID&quot;: [401, 402],
    &quot;学びたいテーマ&quot;: [[&quot;Python&quot;, &quot;pandas&quot;], [&quot;SQL&quot;, &quot;可視化&quot;]],
    &quot;習熟度&quot;: [[&quot;入門&quot;], [&quot;初級&quot;, &quot;入門&quot;]]
})

length_check = skills_error.assign(
    テーマ数=skills_error[&quot;学びたいテーマ&quot;].map(len),
    習熟度数=skills_error[&quot;習熟度&quot;].map(len)
)
length_check[[&quot;回答者ID&quot;, &quot;テーマ数&quot;, &quot;習熟度数&quot;]]</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">401</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</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;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">402</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
  </tbody>
</table></div>
<p>回答者ID<code>401</code>だけ、テーマ数が2、習熟度数が1です。この状態で2列を同時に展開すると、どの習熟度をどのテーマへ対応させるか決められません。</p>

<p>ここでは、元データを確認した結果、<code>pandas</code>の習熟度が未回答だったと分かったものとして、意味を勝手に補わず<code>pd.NA</code>を追加します。</p>

<pre class="line-numbers"><code class="language-python">skills_fixed = skills_error.copy()
skills_fixed.at[0, &quot;習熟度&quot;] = [&quot;入門&quot;, pd.NA]

fixed_long = skills_fixed.explode(
    [&quot;学びたいテーマ&quot;, &quot;習熟度&quot;],
    ignore_index=True
)
fixed_long</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答者ID</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;">401</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</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;">401</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">&lt;NA&gt;</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;">402</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">SQL</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;">402</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>修正後は4行へ展開でき、<code>pandas</code>に対応する習熟度は欠損値として残りました。</p>

<p>重要なのは、エラーを消すためだけに値を複製しないことです。対応関係を元データで確認できない場合は、同時展開を中止するか、欠損として明示してください。</p>

<h2><span id="toc12">空リスト・NaN・通常の文字列の挙動を確認する</span></h2>

<p>セルの状態によって、展開後の結果が変わります。代表的な入力を1つの表で確認します。</p>

<pre class="line-numbers"><code class="language-python">mixed = pd.DataFrame({
    &quot;状態&quot;: [&quot;リスト&quot;, &quot;空リスト&quot;, &quot;NaN&quot;, &quot;通常の文字列&quot;, &quot;数値&quot;],
    &quot;値&quot;: [[&quot;Python&quot;, &quot;pandas&quot;], [], np.nan, &quot;SQL&quot;, 100]
})

mixed_long = mixed.explode(&quot;値&quot;, ignore_index=True)
mixed_long</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">状態</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">リスト</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</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;">pandas</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;">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>
    <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;">SQL</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;">100</td>
    </tr>
  </tbody>
</table></div>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">入力</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">展開後の考え方</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">確認上の注意</th>
</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>
  <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>NaN</code>を持つ1行になる</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">「回答なし」か「空の選択肢」か、元データの意味を確認する</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>NaN</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">そのまま1行残る</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損を削除・補完するかは分析目的で決める</td>
</tr>
<tr>
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">通常の文字列</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">そのまま残る</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">区切り文字列なら先に<code>str.split()</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;">リストとスカラーの混在が意図どおりか確認する</td>
</tr>
</tbody>
</table>

</div><p>空リストと<code>NaN</code>は展開後の表示が似ていますが、元データでの意味が同じとは限りません。処理前に業務上の定義を確認しましょう。</p>

<h2><span id="toc13">展開後にvalue_counts()で件数を集計する</span></h2>

<p>最初のアンケートデータに戻り、テーマ別の回答件数を数えます。</p>

<pre class="line-numbers"><code class="language-python">theme_counts = (
    survey_long[&quot;学びたいテーマ&quot;]
    .value_counts()
    .rename_axis(&quot;学びたいテーマ&quot;)
    .reset_index(name=&quot;回答件数&quot;)
)

theme_counts</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">学びたいテーマ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">回答件数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">Python</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">pandas</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">可視化</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">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;">SQL</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
    </tr>
  </tbody>
</table></div>
<p><code>Python</code>と<code>pandas</code>が2件、<code>可視化</code>と<code>SQL</code>が1件です。回答件数の合計は6件になり、展開後の有効なテーマ数と一致するはずです。</p>

<pre class="line-numbers"><code class="language-python">count_total = theme_counts[&quot;回答件数&quot;].sum()
valid_total = survey_long[&quot;学びたいテーマ&quot;].notna().sum()

print(f&quot;集計表の回答件数合計: {count_total}&quot;)
print(f&quot;展開後の有効テーマ数: {valid_total}&quot;)
print(f&quot;集計結果は一致: {count_total == valid_total}&quot;)</code></pre>
<pre class="colab-output">集計表の回答件数合計: 6
展開後の有効テーマ数: 6
集計結果は一致: True</pre>
<p>両方とも6件なので、展開から集計までの件数は一致しています。</p>

<p>ここで注意したいのは、展開後の<code>len(survey_long)</code>が回答者数ではないことです。回答者数を求めるなら<code>回答者ID.nunique()</code>、選択されたテーマの総数を求めるなら展開後の有効行数を使います。<strong>何を1件と数えるか</strong>を先に決めることが大切です。</p>

<h2><span id="toc14">自分のデータへ置き換えるときのチェックリスト</span></h2>

<ul>
<li><code>df.columns</code>で対象列名が正しいか</li>
<li>対象セルがリスト・タプル等か、区切り文字列か</li>
<li>文字列なら区切り記号と前後空白が何か</li>
<li>空リスト、<code>NaN</code>、空文字がそれぞれ何を意味するか</li>
<li>複数列を展開する場合、各行で要素数と対応順が一致するか</li>
<li>元インデックスを残す必要があるか</li>
<li>展開後に数えたい単位が、元レコード数か要素数か</li>
<li>展開前の要素数合計と、展開・欠損処理後の件数が整合するか</li>
</ul>

<p>対象列の型が混在していそうなら、実行前に値と型の組み合わせを確認します。次の例では、リストだけでなく、文字列・欠損値・数値が混ざっているため、そのまま<code>explode()</code>してもすべての行を同じようには展開できないと分かります。</p>

<pre class="line-numbers"><code class="language-python">type_check_data = pd.DataFrame({
    &quot;元の値&quot;: [[&quot;Python&quot;, &quot;pandas&quot;], &quot;SQL, 可視化&quot;, np.nan, 100]
})

type_check = type_check_data.assign(
    型=type_check_data[&quot;元の値&quot;].map(lambda value: type(value).__name__)
)

type_check</code></pre>
<div class="wp-table-scroll" style="overflow-x: auto; margin: 1em 0;"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: right;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">元の値</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">型</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">[Python, pandas]</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">list</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;">SQL, 可視化</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">str</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;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">float</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;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">int</td>
    </tr>
  </tbody>
</table></div>
<h2><span id="toc15">まとめ</span></h2>

<ul>
<li>セル内のリストを1要素1行へ展開するには<code>explode()</code>を使います。</li>
<li>区切り文字列は、先に<code>str.split()</code>でリスト化します。</li>
<li><code>ignore_index=True</code>なら、展開後のインデックスを0から振り直せます。</li>
<li>指定外の列は繰り返されるため、展開後の行数を回答者数と混同しないようにします。</li>
<li>複数列を同時に展開するには、各行でリストの長さと要素の対応をそろえます。</li>
<li>空リスト、<code>NaN</code>、通常の文字列、スカラーでは挙動が異なるため、元データの型と意味を確認します。</li>
<li>最後に要素数や集計値を照合し、「コードが動いた」だけでなく「正しく展開できた」ことを検算します。</li>
</ul>

<p>展開後は、<a href="https://pythondatalab.com/pandas-value-counts/"><code>value_counts()</code>で全体件数を確認</a>したり、<a href="https://pythondatalab.com/pandas-groupby-agg/"><code>groupby()</code>と<code>agg()</code>で年代別に集計</a>したりできます。必要に応じて欠損処理や表記ゆれの修正を行い、棒グラフなどの可視化へ進みましょう。</p>

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

<ul>
<li><a href="https://pythondatalab.com/pandas-melt/">pandas melt()の使い方｜横持ちデータを縦持ちに変換する方法</a>：セル内ではなく、複数の列を縦持ちへ変換したい場合</li>
<li><a href="https://pythondatalab.com/pandas-reset-index/">pandas reset_index()の使い方</a>：展開後のインデックスを後から整理したい場合</li>
<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の使い方</a>：年代などの属性別に集計したい場合</li>
<li><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方</a>：展開後の欠損値を目的に合わせて補完したい場合</li>
<li><a href="https://pythondatalab.com/pandas-str-strip/">pandas str.strip()の使い方</a>：文字列要素の前後空白を削除したい場合</li>
<li><a href="https://pythondatalab.com/matplotlib-bar-barh-stacked/">Matplotlib 棒グラフ入門</a>：集計した件数をグラフで比較したい場合</li>
</ul>

<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc17"> カテゴリから探す</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-1788437736004" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc18">explode()で文字列が1文字ずつ分かれないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>通常の文字列はlist-likeな複数要素として展開されず、そのまま残るためです。カンマ区切りなどの文字列なら、先に<code>str.split()</code>でリスト化してから<code>explode()</code>を実行します。</p>

</div>
</div>
<div id="faq-question-1788437758129" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc19">複数列を同時に展開するとValueErrorになるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>同時に展開する列のリスト長が、同じ行の中で一致していない可能性があります。各列へ<code>map(len)</code>を適用して要素数を確認し、元データ上の対応関係に従って長さをそろえるか、同時展開をやめてください。</p>

</div>
</div>
<div id="faq-question-1788437771241" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc20">展開後にインデックスが重複するのは問題ですか？</span></h3>
<div class="rank-math-answer ">

<p>初期設定では元インデックスを保持するため、正常な動作です。元行を追跡するならそのまま使い、連番が必要なら<code>ignore_index=True</code>を指定します</p>

</div>
</div>
<div id="faq-question-1788437782393" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">空リストとNaNは展開後にどうなりますか？</span></h3>
<div class="rank-math-answer ">

<p>空リストは<code>NaN</code>を持つ1行になり、もともとの<code>NaN</code>もそのまま残ります。表示が似ていても元データでの意味は異なる場合があるため、削除や補完の前に意味を確認してください。</p>

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

<p>セル内のリスト要素を行へ分けるなら<code>explode()</code>、複数の列を「項目名の列」と「値の列」へまとめるなら<code>melt()</code>を使います</p>

</div>
</div>
<div id="faq-question-1788437804157" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">展開後の行数が正しいか、どう確認しますか？</span></h3>
<div class="rank-math-answer ">

<p>欠損や空リストがない単純なデータなら、展開前の各リストの長さを合計し、展開後の行数と比較します。欠損や空リストがある場合は、それらが1行として残る仕様を考慮し、有効値の件数も併せて確認してください。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-explode/">pandas explode()の使い方｜リスト列を複数行に展開する方法</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-explode/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>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-5" checked><label class="toc-title" for="toc-checkbox-5">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">Pandas DataFrame入門シリーズでの位置づけ</a></li><li><a href="#toc3" tabindex="0">見えない空白が抽出・集計を狂わせる</a></li><li><a href="#toc4" tabindex="0">str.strip()で文字列の前後空白を削除する</a></li><li><a href="#toc5" tabindex="0">str.strip()・str.lstrip()・str.rstrip()の違い</a><ol><li><a href="#toc6" tabindex="0">strip(chars)は指定した語句を丸ごと削除する機能ではない</a></li><li><a href="#toc7" tabindex="0">補足：文字以外の値が混ざる列に注意する</a></li></ol></li><li><a href="#toc8" tabindex="0">列名の前後空白はdf.columns.str.strip()で削除する</a></li><li><a href="#toc9" tabindex="0">strip・replace・renameは目的で使い分ける</a></li><li><a href="#toc10" tabindex="0">よくあるミスと注意点</a><ol><li><a href="#toc11" tabindex="0">1. 結果を代入せず、元の列も変わったと思う</a></li><li><a href="#toc12" tabindex="0">2. 文字列の途中にある空白まで消えると思う</a></li><li><a href="#toc13" tabindex="0">3. NaNと空文字列を同じものとして扱う</a></li><li><a href="#toc14" tabindex="0">4. 混在列を安易にastype(str)へ変換する</a></li><li><a href="#toc15" tabindex="0">5. 全角スペースを見落とす</a></li></ol></li><li><a href="#toc16" tabindex="0">前処理の流れでstr.strip()を使うタイミング</a></li><li><a href="#toc17" tabindex="0">まとめ</a></li><li><a href="#toc18" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc19" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc20" tabindex="0">str.strip()は半角スペースと全角スペースの両方を削除できますか？</a></li><li><a href="#toc21" tabindex="0">str.strip()とstr.replace()はどう使い分けますか？</a></li><li><a href="#toc22" tabindex="0">文字列の途中にある空白も削除できますか？</a></li><li><a href="#toc23" tabindex="0">列名の前後空白をまとめて削除できますか？</a></li><li><a href="#toc24" tabindex="0">str.strip()を使ったのに元のDataFrameが変わらないのはなぜですか？</a></li><li><a href="#toc25" tabindex="0">空白を削除したら別々だったカテゴリは同じ値として集計されますか？</a></li></ol></li></ol>
    </div>
  </div>

<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 read_excel()の使い方｜Excel読み込み・sheet_name・header・usecolsを初心者向けに解説</title>
		<link>https://pythondatalab.com/pandas-read-excel/</link>
					<comments>https://pythondatalab.com/pandas-read-excel/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 09 May 2026 15:41:55 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2201</guid>

					<description><![CDATA[<p>Excelファイルをpandasで読み込めても、タイトル行が列名になったり、違うシートや不要な列まで入ったりすると、その後の集計で迷います。 この記事では、Excelの構造を確認してから sheet_name・heade [&#8230;]</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-read-excel/">pandas read_excel()の使い方｜Excel読み込み・sheet_name・header・usecolsを初心者向けに解説</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.line-numbers,
  .colab-article pre.colab-output {
    margin-top: 0 !important;
    margin-bottom: 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 #cbd5e1;
    white-space: nowrap;
    padding: 0.2em 0.4em;
  }
  .colab-article table.wp-block-table th {
    background-color: #f8fafc;
    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>Excelファイルをpandasで読み込めても、タイトル行が列名になったり、違うシートや不要な列まで入ったりすると、その後の集計で迷います。</p>
<p>この記事では、Excelの構造を確認してから <code>sheet_name</code>・<code>header</code>・<code>usecols</code> を選び、読み込み後にDataFrameを検算する流れを解説します。Google Colabで上から順に実行できます。</p>



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-7" checked><label class="toc-title" for="toc-checkbox-7">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：Excelを見てから3つの指定を選ぶ</a></li><li><a href="#toc3" tabindex="0">実行前：タイトル行と注記を含むExcelを用意する</a></li><li><a href="#toc4" tabindex="0">基本：まずは1シートを読み込む</a></li><li><a href="#toc5" tabindex="0">sheet_name・skiprows・usecolsを指定して正しく読む</a></li><li><a href="#toc6" tabindex="0">headerとskiprowsはどう選ぶ？</a></li><li><a href="#toc7" tabindex="0">複数シートを読むと戻り値が変わる</a></li><li><a href="#toc8" tabindex="0">よくある失敗：現象から直す場所を決める</a><ol><li><a href="#toc9" tabindex="0">FileNotFoundErrorを確認する</a></li><li><a href="#toc10" tabindex="0">型が想定と違うときは、読み込み後に必要な列だけ整える</a></li></ol></li><li><a href="#toc11" tabindex="0">読み込み後は前処理・集計へ進む</a></li><li><a href="#toc12" tabindex="0">まとめ</a></li><li><a href="#toc13" tabindex="0">関連記事</a><ol><li><a href="#toc14" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc15" tabindex="0">read_excel()で特定シートを読むには？</a></li><li><a href="#toc16" tabindex="0">複数シートを読むとDataFrameではないのはなぜですか？</a></li><li><a href="#toc17" tabindex="0">タイトル行を飛ばすには？</a></li><li><a href="#toc18" tabindex="0">数値が文字列として読み込まれたらどうしますか？</a></li><li><a href="#toc19" tabindex="0">Google ColabでFileNotFoundErrorになるのはなぜですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2 id="この記事でわかること"><span id="toc1">この記事でわかること</span></h2>
<ul>
<li><code>pd.read_excel()</code>でExcelをDataFrameへ読み込む基本</li>
<li>読みたいシート、見出し行、必要な列の選び方</li>
<li><code>columns</code>・<code>head()</code>・<code>info()</code>で正しく読めたか確認する方法</li>
<li>ファイルが見つからない、列名が想定と違う、型が合わないときの確認方法</li>
</ul>
<p>この処理は、データ分析の「入力・確認」の工程です。読み込み後は、欠損値や型を整えてから集計・可視化へ進みます。</p>


<h2 id="先に結論excelを見てから3つの指定を選ぶ"><span id="toc2">先に結論：Excelを見てから3つの指定を選ぶ</span></h2>
<div class="table-scroll"><table class="wp-block-table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>Excelで確認すること</th>
<th>指定するもの</th>
<th>選ぶ場面</th>
<th>最初に確認する結果</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>読みたい表はどのシートか</td>
<td><code>sheet_name</code></td>
<td>1枚目以外のシートを読む</td>
<td>選んだシートの列名</td>
</tr>
<tr class="even">
<td>見出しは何行目か</td>
<td><code>header</code> または <code>skiprows</code></td>
<td>タイトル・注記が表の上にある</td>
<td>列名と先頭データ</td>
</tr>
<tr class="odd">
<td>どの列を分析するか</td>
<td><code>usecols</code></td>
<td>不要列を読まない</td>
<td>必要な列だけか</td>
</tr>
</tbody>
</table>
</div><p>まずは指定を増やしすぎずに読み込み、<code>df.columns</code>、<code>df.head()</code>、<code>df.info()</code>で検算します。読み込みが成功しただけでは、分析に使える状態とは限りません。</p>


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

<h2 id="実行前タイトル行と注記を含むexcelを用意する"><span id="toc3">実行前：タイトル行と注記を含むExcelを用意する</span></h2>
<p>ここでは再現用に、2つのシートを持つExcelを作ります。<code>売上</code>シートにはタイトル行、注記行、空行の後に見出し行があります。</p>
<p>実際のExcelでも、最初にこのような構造を確認してください。タイトルや注記をそのまま読んでしまうと、列名・型・集計結果がずれます。</p>


<pre class="line-numbers language-python"><code class="language-python">source_sales = pd.DataFrame({
    "日付": ["2026-04-01", "2026-04-01", "2026-04-02", "2026-04-02"],
    "商品": ["ノート", "ペン", "ノート", "ペン"],
    "売上": [1200, 300, 1500, 450],
    "担当者": ["青木", "井上", "青木", "井上"],
    "社内メモ": ["通常", "通常", "確認済み", "通常"]
})

file_path = "sales_report.xlsx"
with pd.ExcelWriter(file_path, engine="openpyxl") as writer:
    source_sales.to_excel(writer, sheet_name="売上", index=False, startrow=3)
    pd.DataFrame({"月": ["4月"], "目標売上": [5000]}).to_excel(
        writer, sheet_name="集計用", index=False
    )

from openpyxl import load_workbook
book = load_workbook(file_path)
sheet = book["売上"]
sheet["A1"] = "2026年4月 売上レポート"
sheet["A2"] = "注記：金額は税込み"
book.save(file_path)

print(os.listdir())</code></pre>

<pre class="colab-output">['.config', 'sales_report.xlsx', 'sample_data']
</pre>

<p>処理前の <code>売上</code> シートは、1行目がタイトル、2行目が注記、4行目が列名です。したがって、タイトルと注記を飛ばして4行目を列名として読む必要があります。</p>


<h2 id="基本まずは1シートを読み込む"><span id="toc4">基本：まずは1シートを読み込む</span></h2>
<p><code>pd.read_excel()</code>の最小形は、Excelファイルのパスを渡すだけです。複数シートがある場合、指定しなければ先頭のシートを読み込みます。</p>
<p>ただし今回は先頭シートでもタイトル行があるため、このままでは列名が正しくなりません。次のセルであえて確認します。</p>


<pre class="line-numbers language-python"><code class="language-python">df_without_options = pd.read_excel(file_path)
display(df_without_options.head())
print("列名:", df_without_options.columns.tolist())</code></pre>

<div class="table-scroll"><table class="wp-block-table">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>2026年4月 売上レポート</th>
      <th>Unnamed: 1</th>
      <th>Unnamed: 2</th>
      <th>Unnamed: 3</th>
      <th>Unnamed: 4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>注記：金額は税込み</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <td>1</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <td>2</td>
      <td>日付</td>
      <td>商品</td>
      <td>売上</td>
      <td>担当者</td>
      <td>社内メモ</td>
    </tr>
    <tr>
      <td>3</td>
      <td>2026-04-01</td>
      <td>ノート</td>
      <td>1200</td>
      <td>青木</td>
      <td>通常</td>
    </tr>
    <tr>
      <td>4</td>
      <td>2026-04-01</td>
      <td>ペン</td>
      <td>300</td>
      <td>井上</td>
      <td>通常</td>
    </tr>
  </tbody>
</table></div>
<pre class="colab-output">列名: ['2026年4月 売上レポート', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4']
</pre>

<p>この結果ではタイトルが列名になり、正しい表ではありません。コードは動いていても、出力を見なければ誤りに気付けません。</p>
<h2 id="sheet_nameskiprowsusecolsを指定して正しく読む"><span id="toc5">sheet_name・skiprows・usecolsを指定して正しく読む</span></h2>
<ul>
<li><code>sheet_name="売上"</code>：分析したいシートを名前で選びます。</li>
<li><code>skiprows=3</code>：タイトル・注記・空行を飛ばし、次の行を列名として使います。</li>
<li><code>usecols="A:D"</code>：分析に必要な4列だけを読みます。社内メモはこの分析では使いません。</li>
</ul>


<pre class="line-numbers language-python"><code class="language-python">df = pd.read_excel(
    file_path,
    sheet_name="売上",
    skiprows=3,
    usecols="A:D"
)

display(df)
print("列名:", df.columns.tolist())
print("行数:", len(df))
df.info()</code></pre>

<div class="table-scroll"><table class="wp-block-table">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>日付</th>
      <th>商品</th>
      <th>売上</th>
      <th>担当者</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>2026-04-01</td>
      <td>ノート</td>
      <td>1200</td>
      <td>青木</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2026-04-01</td>
      <td>ペン</td>
      <td>300</td>
      <td>井上</td>
    </tr>
    <tr>
      <td>2</td>
      <td>2026-04-02</td>
      <td>ノート</td>
      <td>1500</td>
      <td>青木</td>
    </tr>
    <tr>
      <td>3</td>
      <td>2026-04-02</td>
      <td>ペン</td>
      <td>450</td>
      <td>井上</td>
    </tr>
  </tbody>
</table></div>
<pre class="colab-output">列名: ['日付', '商品', '売上', '担当者']
行数: 4
&lt;class 'pandas.core.frame.DataFrame'&gt;
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   日付      4 non-null      object
 1   商品      4 non-null      object
 2   売上      4 non-null      int64 
 3   担当者     4 non-null      object
dtypes: int64(1), object(3)
memory usage: 260.0+ bytes
</pre>

<p>出力では、列名が <code>日付</code>・<code>商品</code>・<code>売上</code>・<code>担当者</code> になり、4行の売上データだけが読めています。<code>売上</code>が整数型、<code>日付</code>が文字列型であることも <code>info()</code> で確認します。</p>
<p>日付を月別に集計する前には、<code>日付</code>をdatetime型へ変換する必要があります。読み込み直後に型を確認する理由は、見た目が日付や数値でもDataFrame内の型が違う場合があるためです。</p>


<h2 id="headerとskiprowsはどう選ぶ"><span id="toc6">headerとskiprowsはどう選ぶ？</span></h2>
<p>見出し行より前を丸ごと飛ばすなら <code>skiprows</code> が分かりやすい選択です。Excelの0始まりの行番号で見出し行を直接指定するなら <code>header</code> を使えます。今回の見出しはExcelの4行目なので、<code>header=3</code> でも同じ結果になります。</p>
<div class="table-scroll"><table class="wp-block-table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Excelの状態</th>
<th>選択</th>
<th>注意点</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>見出しより上にタイトル・注記がある</td>
<td><code>skiprows</code></td>
<td>飛ばした直後の行が列名になるか確認する</td>
</tr>
<tr class="even">
<td>見出しが何行目か明確</td>
<td><code>header</code></td>
<td>行番号は0始まり</td>
</tr>
<tr class="odd">
<td>Excelに見出しがない</td>
<td><code>header=None</code> と <code>names</code></td>
<td>列名は自分で与える</td>
</tr>
</tbody>
</table>
</div>

<pre class="line-numbers language-python"><code class="language-python">df_with_header = pd.read_excel(
    file_path, sheet_name="売上", header=3, usecols="A:D"
)

print("skiprowsで読んだ列名:", df.columns.tolist())
print("headerで読んだ列名:  ", df_with_header.columns.tolist())
print("同じ内容か:         ", df.equals(df_with_header))</code></pre>

<pre class="colab-output">skiprowsで読んだ列名: ['日付', '商品', '売上', '担当者']
headerで読んだ列名:   ['日付', '商品', '売上', '担当者']
同じ内容か:          True
</pre>

<p><code>header</code> と <code>skiprows</code> を同時に何となく増やすと、見出し行まで飛ばしてしまうことがあります。列名が <code>Unnamed: 0</code> になったり、商品名が列名になったりしたら、まず <code>header=None</code> で数行を表示し、見出しの実際の位置を確認してから指定を直してください。</p>
<h2 id="複数シートを読むと戻り値が変わる"><span id="toc7">複数シートを読むと戻り値が変わる</span></h2>
<p><code>sheet_name</code> にリストまたは <code>None</code> を渡すと、戻り値はDataFrameではなく「シート名をキー、DataFrameを値にする辞書」です。1つの表として <code>head()</code> を呼べると思い込まないことが大切です。</p>


<pre class="line-numbers language-python"><code class="language-python">sheets = pd.read_excel(file_path, sheet_name=["売上", "集計用"])
print(type(sheets))
print("読み込んだシート:", list(sheets.keys()))
display(sheets["集計用"])</code></pre>

<pre class="colab-output">&lt;class 'dict'&gt;
読み込んだシート: ['売上', '集計用']
</pre>
<div class="table-scroll"><table class="wp-block-table">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>月</th>
      <th>目標売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>4月</td>
      <td>5000</td>
    </tr>
  </tbody>
</table></div>

<p>複数シートを毎回処理する必要がないなら、初心者はまず必要な1シートだけを指定する方が、確認する対象を絞れて安全です。</p>
<h2 id="よくある失敗現象から直す場所を決める"><span id="toc8">よくある失敗：現象から直す場所を決める</span></h2>
<div class="table-scroll"><table class="wp-block-table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>現象</th>
<th>主な原因</th>
<th>確認方法</th>
<th>修正方針</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>FileNotFoundError</code></td>
<td>パス・名前・拡張子が違う</td>
<td><code>os.listdir()</code>でファイル名を見る</td>
<td>アップロード先と <code>file_path</code> を一致させる</td>
</tr>
<tr class="even">
<td>列名が想定と違う</td>
<td>タイトル行や注記行を読んだ</td>
<td><code>header=None</code> で先頭行を見る</td>
<td><code>skiprows</code> または <code>header</code> を調整する</td>
</tr>
<tr class="odd">
<td>必要な列がない</td>
<td><code>usecols</code> がExcelの列と合わない</td>
<td><code>df.columns.tolist()</code>を確認する</td>
<td>実際の列名・列記号に合わせる</td>
</tr>
<tr class="even">
<td>数値や日付が文字列</td>
<td>Excelのセル形式・値が混在</td>
<td><code>df.info()</code>でdtypeを見る</td>
<td>必要な列だけ型を整える</td>
</tr>
</tbody>
</table>
</div>

<h3 id="filenotfounderrorを確認する"><span id="toc9">FileNotFoundErrorを確認する</span></h3>
<p>Colabへ自分のExcelをアップロードした場合、保存されたファイル名を確認してから <code>file_path</code> に設定します。次のセルを実行し、一覧にある名前をそのまま使ってください。</p>


<pre class="line-numbers language-python"><code class="language-python"># 自分のExcelをColabへアップロードする場合だけ、先頭の # を外して実行します。
# from google.colab import files
# uploaded = files.upload()

print("現在のExcelファイル:")
print([name for name in os.listdir() if name.lower().endswith((".xlsx", ".xls"))])</code></pre>

<pre class="colab-output">現在のExcelファイル:
['sales_report.xlsx']
</pre>

<h3 id="型が想定と違うときは読み込み後に必要な列だけ整える"><span id="toc10">型が想定と違うときは、読み込み後に必要な列だけ整える</span></h3>
<p>今回の <code>日付</code> は文字列として読み込まれています。読み込み設定の誤りではなく、次の前処理で扱う問題です。列全体を無条件に変換せず、変換後に欠損が増えていないか確認します。</p>


<pre class="line-numbers language-python"><code class="language-python">df_checked = df.copy()
df_checked["日付"] = pd.to_datetime(df_checked["日付"], errors="coerce")

display(df_checked)
print("日付の欠損数:", df_checked["日付"].isna().sum())
print("日付列の型:", df_checked["日付"].dtype)</code></pre>

<div class="table-scroll"><table class="wp-block-table">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>日付</th>
      <th>商品</th>
      <th>売上</th>
      <th>担当者</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>2026-04-01</td>
      <td>ノート</td>
      <td>1200</td>
      <td>青木</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2026-04-01</td>
      <td>ペン</td>
      <td>300</td>
      <td>井上</td>
    </tr>
    <tr>
      <td>2</td>
      <td>2026-04-02</td>
      <td>ノート</td>
      <td>1500</td>
      <td>青木</td>
    </tr>
    <tr>
      <td>3</td>
      <td>2026-04-02</td>
      <td>ペン</td>
      <td>450</td>
      <td>井上</td>
    </tr>
  </tbody>
</table></div>
<pre class="colab-output">日付の欠損数: 0
日付列の型: datetime64[ns]
</pre>

<p>変換後の <code>日付</code> 列が <code>datetime64[ns]</code> になり、欠損数が0なら、月別集計や時系列グラフの準備ができています。<code>errors="coerce"</code> を使うと変換できない値は <code>NaT</code> になるため、必ず欠損数を確認してください。</p>
<h2 id="読み込み後は前処理集計へ進む"><span id="toc11">読み込み後は前処理・集計へ進む</span></h2>
<p>Excelを正しく読み込んだ後は、次の順番で進むと安全です。</p>
<ol type="1">
<li><code>info()</code>で列・型・欠損値を確認する</li>
<li>列名や文字列の前後空白を整える</li>
<li>数値・日付を必要な型に変換する</li>
<li><code>groupby()</code>で商品別や担当者別に集計する</li>
</ol>
<p>たとえば今回なら、日付を変換した後に商品別の売上を集計できます。未確認の列や型のまま集計へ進まないことが大切です。</p>


<pre class="line-numbers language-python"><code class="language-python">sales_by_product = (
    df_checked.groupby("商品", as_index=False)["売上"]
    .sum()
    .sort_values("売上", ascending=False)
)
display(sales_by_product)</code></pre>

<div class="table-scroll"><table class="wp-block-table">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>商品</th>
      <th>売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>ノート</td>
      <td>2700</td>
    </tr>
    <tr>
      <td>1</td>
      <td>ペン</td>
      <td>750</td>
    </tr>
  </tbody>
</table></div>

<h2 id="まとめ"><span id="toc12">まとめ</span></h2>
<ul>
<li><code>read_excel()</code>の前に、対象シート・見出し行・必要列をExcelで確認する</li>
<li>特定シートは <code>sheet_name</code>、表の上のタイトルや注記は <code>skiprows</code> または <code>header</code>、必要列だけなら <code>usecols</code> を使う</li>
<li>読み込み後は <code>columns</code>・<code>head()</code>・<code>info()</code>で、列名・データ・型を必ず検算する</li>
<li>読み込み成功と分析可能は別であり、型や欠損を確認してから前処理・集計へ進む</li>
</ul>


<h2 id="関連記事"><span id="toc13">関連記事</span></h2>
<ul>
<li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>：Colabで自分のファイルを読み込む手順</li>
<li><a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a>：読み込み後に列・型・欠損値を確認する</li>
<li><a href="https://pythondatalab.com/pandas-str-strip/">pandas str.strip()の使い方</a>：列名や文字列の前後空白を削除する</li>
<li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>：文字列の数字を数値へ変換する</li>
<li><a href="https://pythondatalab.com/pandas-preprocessing-basic/">Pandasデータ前処理の基本</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="toc14"> カテゴリから探す</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-1788968241309" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc15">read_excel()で特定シートを読むには？</span></h3>
<div class="rank-math-answer ">

<p><code>sheet_name="売上"</code> のようにシート名を指定します。番号で指定する場合は0始まりです。</p>

</div>
</div>
<div id="faq-question-1788968260506" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc16">複数シートを読むとDataFrameではないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>sheet_name</code>にリストや<code>None</code>を指定すると、シートごとのDataFrameをまとめた辞書が返ります。<code>sheets["売上"]</code>のように取り出します。</p>

</div>
</div>
<div id="faq-question-1788968273908" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc17">タイトル行を飛ばすには？</span></h3>
<div class="rank-math-answer ">

<p>見出しの前にある行数を<code>skiprows</code>に指定します。先に<code>header=None</code>で先頭数行を確認すると、飛ばす行数を判断しやすくなります。</p>

</div>
</div>
<div id="faq-question-1788968287187" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc18">数値が文字列として読み込まれたらどうしますか？</span></h3>
<div class="rank-math-answer ">

<p>まず<code>info()</code>で対象列の型を確認します。その後、必要な列だけ<code>pd.to_numeric(..., errors="coerce")</code>で変換し、変換できなかった値が欠損になっていないか確認します。</p>

</div>
</div>
<div id="faq-question-1788968295006" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc19">Google ColabでFileNotFoundErrorになるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>Colabにアップロードしたファイル名と<code>file_path</code>が一致していないことが多い原因です。<code>os.listdir()</code>で実際のファイル名を確認してください。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-read-excel/">pandas read_excel()の使い方｜Excel読み込み・sheet_name・header・usecolsを初心者向けに解説</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-read-excel/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>


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">やりたいこと別：between()を使う場面</a></li><li><a href="#toc3" tabindex="0">サンプルデータを用意する</a></li><li><a href="#toc4" tabindex="0">数値を範囲で抽出する方法</a><ol><li><a href="#toc5" tabindex="0">まずbetween()で範囲内かどうかを判定する</a></li><li><a href="#toc6" tabindex="0">判定結果を使って行を抽出する</a></li></ol></li><li><a href="#toc7" tabindex="0">日付を範囲で抽出する方法</a></li><li><a href="#toc8" tabindex="0">inclusiveで数値や日付の範囲の境界値を含める・含めない設定</a></li><li><a href="#toc9" tabindex="0">範囲抽出で欠損値があるときの注意点</a></li><li><a href="#toc10" tabindex="0">between()と&gt;=・&lt;=・query()・cut()の違い</a><ol><li><a href="#toc11" tabindex="0">query()で書く場合</a></li><li><a href="#toc12" tabindex="0">cut()は抽出ではなく分類に使う</a></li><li><a href="#toc13" tabindex="0">between()を使わない場面も確認しておく</a></li></ol></li><li><a href="#toc14" tabindex="0">抽出したデータを集計して確認する</a><ol><li><a href="#toc15" tabindex="0">必要に応じてグラフで確認する</a></li></ol></li><li><a href="#toc16" tabindex="0">よくあるミスと確認ポイント</a></li><li><a href="#toc17" tabindex="0">between()は前処理・抽出で使う</a></li><li><a href="#toc18" tabindex="0">まとめ：between()は数値・日付の範囲抽出を読みやすくする方法</a></li><li><a href="#toc19" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc20" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc21" tabindex="0">pandasのbetween()は何をするメソッドですか？</a></li><li><a href="#toc22" tabindex="0">between()は境界値を含みますか？</a></li><li><a href="#toc23" tabindex="0">between()で日付の範囲抽出はできますか？</a></li><li><a href="#toc24" tabindex="0">between()と&gt;=・&lt;=は何が違いますか？</a></li><li><a href="#toc25" tabindex="0">between()とquery()はどちらを使えばよいですか？</a></li><li><a href="#toc26" tabindex="0">between()とcut()は何が違いますか？</a></li><li><a href="#toc27" tabindex="0">範囲抽出で欠損値があるとき、between()はどうなりますか？</a></li><li><a href="#toc28" tabindex="0">文字列の数字にbetween()を使ってもよいですか？</a></li></ol></li></ol>
    </div>
  </div>

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



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-9" checked><label class="toc-title" for="toc-checkbox-9">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">まずdtypesで型を確認してからselect_dtypes()を使う</a></li><li><a href="#toc3" tabindex="0">select_dtypes()とは？</a></li><li><a href="#toc4" tabindex="0">まずはサンプルデータを作る</a></li><li><a href="#toc5" tabindex="0">まずは変換前のデータで数値列だけを選んでみる</a></li><li><a href="#toc6" tabindex="0">売上を数値型に変換する</a></li><li><a href="#toc7" tabindex="0">変換後に数値列だけを選ぶ：include=&#8221;number&#8221;</a></li><li><a href="#toc8" tabindex="0">文字列が入っている列だけを選ぶ：include=[&#8220;object&#8221;, &#8220;string&#8221;]</a></li><li><a href="#toc9" tabindex="0">object型を選ぶときの注意</a></li><li><a href="#toc10" tabindex="0">日付列だけを選ぶ：include=&#8221;datetime&#8221;</a></li><li><a href="#toc11" tabindex="0">補足：category列やbool列も選べる</a></li><li><a href="#toc12" tabindex="0">excludeで特定の型を除外する</a></li><li><a href="#toc13" tabindex="0">select_dtypes()で次の処理に進みやすくする</a></li><li><a href="#toc14" tabindex="0">まとめ</a><ol><li><a href="#toc15" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc16" tabindex="0">pandasで数値列だけ抽出するにはどうすればよいですか？</a></li><li><a href="#toc17" tabindex="0">pandasで文字列が入っている列だけ選ぶにはどうすればよいですか？</a></li><li><a href="#toc18" tabindex="0">日付列だけを選ぶことはできますか？</a></li><li><a href="#toc19" tabindex="0">select_dtypes()で型は変換できますか？</a></li><li><a href="#toc20" tabindex="0">うまく列が選ばれないときは何を確認すればよいですか？</a></li><li><a href="#toc21" tabindex="0">includeとexcludeを同時に使うときの注意はありますか？</a></li></ol></li></ol>
    </div>
  </div>

<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[抽出・前処理]]></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>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">Pandas前処理の中での位置づけ</a></li><li><a href="#toc3" tabindex="0">where()とmask()の判断基準</a></li><li><a href="#toc4" tabindex="0">サンプルデータを用意する</a></li><li><a href="#toc5" tabindex="0">where()の基本：条件を満たす値を残す</a><ol><li><a href="#toc6" tabindex="0">補足：NaNが入ると小数表示になることがある</a></li></ol></li><li><a href="#toc7" tabindex="0">where()で条件に合わない値を別の値に置き換える</a></li><li><a href="#toc8" tabindex="0">mask()の基本：条件を満たす値を置き換える</a></li><li><a href="#toc9" tabindex="0">where()とmask()の違いを同じデータで比較する</a></li><li><a href="#toc10" tabindex="0">複数条件でwhere()を使う場合</a></li><li><a href="#toc11" tabindex="0">補足：DataFrame全体にもwhere()・mask()は使える</a></li><li><a href="#toc12" tabindex="0">where()・mask()・replace()・fillna()・locの使い分け</a></li><li><a href="#toc13" tabindex="0">locでの条件代入との違い</a></li><li><a href="#toc14" tabindex="0">新しい列として結果を残すと確認しやすい</a></li><li><a href="#toc15" tabindex="0">よくあるミス1：代入しないと元のDataFrameは変わらない</a></li><li><a href="#toc16" tabindex="0">よくあるミス2：条件式の向きが逆になる</a></li><li><a href="#toc17" tabindex="0">条件に合わない値をNaNにしたあとの流れ</a></li><li><a href="#toc18" tabindex="0">np.where()には軽く触れる程度でよい</a></li><li><a href="#toc19" tabindex="0">データ分析の流れではどこで使うか</a></li><li><a href="#toc20" tabindex="0">まとめ</a></li><li><a href="#toc21" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc22" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc23" tabindex="0">where()とmask()の違いは何ですか？</a></li><li><a href="#toc24" tabindex="0">where()とreplace()はどう使い分けますか？</a></li><li><a href="#toc25" tabindex="0">where()とlocで条件代入する方法は何が違いますか？</a></li><li><a href="#toc26" tabindex="0">where()で元のDataFrameが変わらないのはなぜですか？</a></li><li><a href="#toc27" tabindex="0">条件に合わない値をNaNにするにはどうすればよいですか？</a></li><li><a href="#toc28" tabindex="0">np.where()とpandasのwhere()はどちらを使えばよいですか？</a></li><li><a href="#toc29" tabindex="0">複数条件でもwhere()は使えますか？</a></li><li><a href="#toc30" tabindex="0">fillna()とは何が違いますか？</a></li></ol></li></ol>
    </div>
  </div>

<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>
		<item>
		<title>pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</title>
		<link>https://pythondatalab.com/pandas-to-numeric/</link>
					<comments>https://pythondatalab.com/pandas-to-numeric/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Wed, 06 May 2026 11:27:53 +0000</pubDate>
				<category><![CDATA[抽出・前処理]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2055</guid>

					<description><![CDATA[<p>pandasのto_numeric()で文字列の数字を数値に変換する方法を初心者向けに解説。object型で計算できない原因、errors="coerce"でNaNにする使い方、astype()との違い、カンマ・円付き金額の前処理まで具体例で紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</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 .notebook-output {
    margin: 0;
    padding: 1em;
    overflow-x: auto;
    white-space: pre;
    background: #f7f7f7;
    border: 1px solid #ddd;
  }
  .colab-article .table-scroll {
    overflow-x: auto;
    margin: 0;
  }
</style>
<div class="colab-article">


<p>CSVやExcelから読み込んだ売上列が数字に見えるのに、<code>object</code>型になって計算できないことがあります。原因は、列の中にカンマや「円」、「-」、「不明」など、数値としてそのまま解釈できない文字が混ざっているためです。</p>

<p>このような列には、<code>pd.to_numeric()</code>が役立ちます。結論からいうと、<strong>変換できない値を発見しながら数値化したいときは、<code>errors="coerce"</code>を使い、変換後にNaNになった元値を必ず確認します</strong>。</p>

<p><code>errors="coerce"</code>は、間違った値を自動修正する指定ではありません。変換できない値をNaNにして処理を続ける指定です。この記事では、どの値がNaNになったかを追跡し、修正・欠損扱い・除外を自分で判断できるところまで進みます。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-11" checked><label class="toc-title" for="toc-checkbox-11">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">to_numeric()・astype()・errorsの選び方</a><ol><li><a href="#toc3" tabindex="0">errors=&#8221;ignore&#8221;は使わない</a></li></ol></li><li><a href="#toc4" tabindex="0">まずはきれいな文字列を数値へ変換する</a></li><li><a href="#toc5" tabindex="0">数値に変換できない値が混ざるデータを確認する</a></li><li><a href="#toc6" tabindex="0">既定のerrors=&#8221;raise&#8221;では変換できない値で停止する</a></li><li><a href="#toc7" tabindex="0">errors=&#8221;coerce&#8221;の結果は元値と並べて読む</a></li><li><a href="#toc8" tabindex="0">カンマと「円」を除去してから数値化する</a></li><li><a href="#toc9" tabindex="0">元からの欠損と変換失敗を分ける</a></li><li><a href="#toc10" tabindex="0">NaNを0で埋める前に意味を判断する</a></li><li><a href="#toc11" tabindex="0">集計前に件数・欠損・dtypeを確認する</a></li><li><a href="#toc12" tabindex="0">自分のデータへ置き換えるときのチェックリスト</a></li><li><a href="#toc13" tabindex="0">数値化した後の分析へつなげる</a></li><li><a href="#toc14" tabindex="0">まとめ</a></li><li><a href="#toc15" tabindex="0">関連記事</a><ol><li><a href="#toc16" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc17" tabindex="0">to_numeric()とastype()はどう使い分けますか？</a></li><li><a href="#toc18" tabindex="0">errors=&#8221;ignore&#8221;は現在も使えますか？</a></li><li><a href="#toc19" tabindex="0">coerce後にNaNになった行だけを確認するには？</a></li><li><a href="#toc20" tabindex="0">変換後が整数型ではなくfloat64などになるのはなぜですか？</a></li><li><a href="#toc21" tabindex="0">DataFrameの複数列をまとめてto_numeric()へ渡せますか？</a></li><li><a href="#toc22" tabindex="0">カンマ・円・全角数字はそのまま変換できますか？</a></li><li><a href="#toc23" tabindex="0">変換後のNaNを0で埋めてもよいですか？</a></li></ol></li></ol>
    </div>
  </div>

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

<ul>
<li>
<code>pd.to_numeric()</code>で文字列の数字を数値へ変換する方法</li>
<li>
<code>errors="raise"</code>と<code>errors="coerce"</code>の違い</li>
<li>
<code>to_numeric()</code>と<code>astype()</code>の使い分け</li>
<li>カンマや「円」を含む値の前処理</li>
<li>元からの欠損と、変換失敗で生じたNaNの見分け方</li>
<li>変換後に0埋め・修正・除外を選ぶ基準</li>
</ul>

<p>この処理は、データ分析の流れでは<strong>データ読込後の型確認と前処理</strong>に位置します。</p>

<blockquote>
<p><a href="https://pythondatalab.com/google-colab-csv/">CSV読込</a>・<a href="https://pythondatalab.com/pandas-read-excel/">Excel読込</a> → <a href="https://pythondatalab.com/pandas-info-method/"><code>info()</code>で型を確認</a>
→ 文字を清掃 → <code>to_numeric()</code>で数値化 → 変換失敗を確認 →
欠損処理 → 集計・可視化</p>
</blockquote>
<h2 id="to_numericastypeerrorsの選び方"><span id="toc2">to_numeric()・astype()・errorsの選び方</span></h2>

<p>最初に、どの方法を選ぶか整理します。</p>

<div class="table-scroll">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr class="header">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">方法</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">何をするか</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">選ぶ場面</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">不正な値がある場合</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">注意点</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">
<code>astype(int)</code>など</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">指定した型へ変換</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">値がすべて整っていて、変換先の型が決まっている</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">基本的にエラーで停止</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不正値を探しながら変換する用途には不向き</td>
</tr>
<tr class="even">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;"><code>pd.to_numeric()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">数値へ変換</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不正値があれば処理を止めて修正したい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">既定の<code>errors="raise"</code>でエラー</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">原因を直してから再実行する場合に向く</td>
</tr>
<tr class="odd">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;"><code>pd.to_numeric(..., errors="coerce")</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">変換できる値を数値化</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不正値をNaNとして発見し、処理を続けたい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">変換できない値がNaNになる</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">NaNになった元値の確認が必須</td>
</tr>
</tbody>
</table>
</div>
<p>判断の基本は、**きれいな値なら<a href="https://pythondatalab.com/pandas-astype/"><code>astype()</code></a>、汚れた可能性がある数値列なら`to_numeric()`**です。</p>

<h3 id="errorsignoreは使わない"><span id="toc3">errors=&#8221;ignore&#8221;は使わない</span></h3>

<p>古いコードでは<code>errors="ignore"</code>を見かけますが、一部の値だけを無視して残りを変換する指定ではありません。pandas
2.2で非推奨となり、確認したpandas
3.0系の公式APIでは<code>errors</code>の選択肢は<code>raise</code>と<code>coerce</code>です。新しく書くコードでは使わず、処理を止めるか、NaNにして確認するかを選びましょう。</p>
<h2 id="まずはきれいな文字列を数値へ変換する"><span id="toc4">まずはきれいな文字列を数値へ変換する</span></h2>

<p>最初に、数字だけで構成されたSeriesを変換します。<code>pd.to_numeric()</code>は、Seriesなどの1次元データを数値化するときに使います。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd

売上_文字列 = pd.Series([&quot;1200&quot;, &quot;1500&quot;, &quot;2000&quot;], name=&quot;売上_文字列&quot;)
売上_数値 = pd.to_numeric(売上_文字列)

pd.DataFrame({
    &quot;変換前&quot;: 売上_文字列,
    &quot;変換後&quot;: 売上_数値,
})</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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">変換前</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">変換後</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>"1200"</code>のような文字列が、計算できる数値へ変わりました。変換後のdtypeは入力値やpandasのバージョンによって変わる場合があるため、型名を暗記するのではなく、実際の出力で確認します。</p>
<pre class="line-numbers"><code class="language-python">print(&quot;変換前のdtype:&quot;, 売上_文字列.dtype)
print(&quot;変換後のdtype:&quot;, 売上_数値.dtype)</code></pre>
<pre class="notebook-output"><code>変換前のdtype: object
変換後のdtype: int64</code></pre>
<p>この例では、変換前は文字列を格納した<code>object</code>型、変換後は整数型です。小数や欠損値が含まれる場合は、別の数値dtypeになることがあります。<strong>数値型になったか</strong>を確認することが大切です。</p>
<h2 id="数値に変換できない値が混ざるデータを確認する"><span id="toc5">数値に変換できない値が混ざるデータを確認する</span></h2>

<p>実際のCSVでは、数字以外の値が混ざります。ここでは次の8件を使います。</p>

<ul>
<li>
<code>"1,500"</code>：カンマ付き</li>
<li>
<code>"2,000円"</code>：カンマと通貨記号付き</li>
<li>
<code>"-"</code>、<code>"不明"</code>：そのままでは数値化できない値</li>
<li>
<code>None</code>：元からの欠損</li>
<li>
<code>"0"</code>：有効な0</li>
<li>
<code>"-300"</code>：返品などを表す可能性がある負数</li>
</ul>

<p>0や負数は自動的に誤りと決めず、データの意味を確認します。</p>
<pre class="line-numbers"><code class="language-python">df = pd.DataFrame({
    &quot;商品&quot;: [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;E&quot;, &quot;F&quot;, &quot;G&quot;, &quot;H&quot;],
    &quot;売上_元データ&quot;: [&quot;1200&quot;, &quot;1,500&quot;, &quot;2,000円&quot;, &quot;-&quot;, &quot;不明&quot;, None, &quot;0&quot;, &quot;-300&quot;],
})

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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_元データ</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1,500</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">C</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2,000円</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">D</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">E</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">F</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">None</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">G</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">H</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
    </tr>
  </tbody>
</table>
</div>
<p>まず、<code>info()</code>で列数、Non-Null
Count、dtypeを確認します。</p>
<pre class="line-numbers"><code class="language-python">df.info()</code></pre>
<pre class="notebook-output"><code>&lt;class &#x27;pandas.core.frame.DataFrame&#x27;&gt;
RangeIndex: 8 entries, 0 to 7
Data columns (total 2 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   商品       8 non-null      object
 1   売上_元データ  7 non-null      object
dtypes: object(2)
memory usage: 260.0+ bytes</code></pre>
<p><code>売上_元データ</code>は8行中7件が非欠損で、dtypeは<code>object</code>です。<code>object</code>と表示されたことだけで中身がすべて同じ種類の文字列とは限りません。実際の値も確認してから変換します。</p>
<h2 id="既定のerrorsraiseでは変換できない値で停止する"><span id="toc6">既定のerrors=&#8221;raise&#8221;では変換できない値で停止する</span></h2>

<p><code>errors</code>を指定しない場合は<code>raise</code>です。数値として解釈できない値が見つかると、処理がエラーで停止します。</p>

<p>Notebookを上から実行できるよう、次のセルでは<code>try</code>と<code>except</code>でエラー名だけを確認します。</p>
<pre class="line-numbers"><code class="language-python">try:
    pd.to_numeric(df[&quot;売上_元データ&quot;])
except ValueError as エラー:
    print(&quot;起きたエラー:&quot;, type(エラー).__name__)
    print(&quot;原因を含むメッセージ:&quot;, エラー)</code></pre>
<pre class="notebook-output"><code>起きたエラー: ValueError
原因を含むメッセージ: Unable to parse string &quot;1,500&quot; at position 1</code></pre>
<p><strong>現象</strong>は<code>ValueError</code>で変換が止まること、<strong>原因</strong>は<code>"1,500"</code>などをそのまま数値として解釈できないことです。</p>

<p>この段階で<code>errors="coerce"</code>へ切り替えるだけでも処理は進みますが、カンマや「円」のように規則が明確な文字までNaNになります。まず、どの値が変換できないかを確認します。</p>
<h2 id="errorscoerceの結果は元値と並べて読む"><span id="toc7">errors=&#8221;coerce&#8221;の結果は元値と並べて読む</span></h2>

<p>元の列は上書きせず、試しに変換した結果を別のSeriesとして並べます。</p>
<pre class="line-numbers"><code class="language-python">そのまま変換 = pd.to_numeric(df[&quot;売上_元データ&quot;], errors=&quot;coerce&quot;)

pd.DataFrame({
    &quot;元の値&quot;: df[&quot;売上_元データ&quot;],
    &quot;そのまま数値化&quot;: そのまま変換,
})</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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">元の値</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">そのまま数値化</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1,500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2,000円</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">None</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300.0</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>"1200"</code>、<code>"0"</code>、<code>"-300"</code>は数値になりました。一方、カンマ付き、円付き、<code>"-"</code>、<code>"不明"</code>はNaNです。<code>None</code>もNaNなので、<strong>出力のNaNだけを見ても、元から欠損していたのか、変換に失敗したのか区別できません</strong>。</p>

<p>これが、コードは動いても結果を誤解しやすいポイントです。次に、規則が明確な文字だけを清掃し、失敗理由を分けます。</p>
<h2 id="カンマと円を除去してから数値化する"><span id="toc8">カンマと「円」を除去してから数値化する</span></h2>

<p>カンマと「円」は売上金額の装飾文字として使われていると分かっているため、変換前に除去します。表記ゆれや特定値の置換を詳しく確認したい場合は、<a href="https://pythondatalab.com/pandas-replace/">pandas
replace()の使い方</a>も参照してください。`astype(&#8220;string&#8221;)`を使うと、元の<code>None</code>を文字列<code>"None"</code>に変えず、欠損の<code>&lt;NA&gt;</code>として保持できます。</p>
<pre class="line-numbers"><code class="language-python">df[&quot;売上_清掃後&quot;] = (
    df[&quot;売上_元データ&quot;]
    .astype(&quot;string&quot;)
    .str.replace(&quot;,&quot;, &quot;&quot;, regex=False)
    .str.replace(&quot;円&quot;, &quot;&quot;, regex=False)
)

df[&quot;売上_数値&quot;] = pd.to_numeric(df[&quot;売上_清掃後&quot;], errors=&quot;coerce&quot;)

df[[&quot;商品&quot;, &quot;売上_元データ&quot;, &quot;売上_清掃後&quot;, &quot;売上_数値&quot;]]</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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_元データ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_清掃後</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_数値</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1,500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">C</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2,000円</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">D</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">E</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">F</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">None</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">G</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">H</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
    </tr>
  </tbody>
</table>
</div>
<p>カンマ付きの<code>"1,500"</code>は<code>1500</code>、円付きの<code>"2,000円"</code>は<code>2000</code>へ変換できました。<code>"-"</code>と<code>"不明"</code>は、文字を除去しても数値の意味が確定しないためNaNのままです。</p>

<p>実際のデータへ置き換えるときは、海外形式の小数点・桁区切りに単純なカンマ除去を適用しないでください。表記規則を確認してから清掃します。</p>
<h2 id="元からの欠損と変換失敗を分ける"><span id="toc9">元からの欠損と変換失敗を分ける</span></h2>

<p>次の2列を追加します。</p>

<ul>
<li>
<code>元から欠損</code>：入力時点ですでに欠損していた行</li>
<li>
<code>変換失敗</code>：元値は存在したが、数値化後に欠損となった行</li>
</ul>

<p>この判定があると、NaNを一律に0へ変える事故を防げます。</p>
<pre class="line-numbers"><code class="language-python">df[&quot;元から欠損&quot;] = df[&quot;売上_元データ&quot;].isna()
df[&quot;変換失敗&quot;] = df[&quot;売上_数値&quot;].isna() &amp; df[&quot;売上_元データ&quot;].notna()

df[[
    &quot;商品&quot;, &quot;売上_元データ&quot;, &quot;売上_清掃後&quot;, &quot;売上_数値&quot;,
    &quot;元から欠損&quot;, &quot;変換失敗&quot;
]]</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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_元データ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_清掃後</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_数値</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">元から欠損</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">変換失敗</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1,500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">C</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2,000円</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">D</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">True</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">E</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">True</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">F</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">None</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">True</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">G</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">H</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">False</td>
    </tr>
  </tbody>
</table>
</div>
<p>処理前後表では、商品DとEだけが<code>変換失敗=True</code>です。商品Fは数値列でNaNですが、<code>元から欠損=True</code>なので変換失敗ではありません。商品Gの0と商品Hの負数は、変換可能な数値として残っています。</p>

<p>変換できなかった行だけを取り出して、元値を確認します。</p>
<pre class="line-numbers"><code class="language-python">df.loc[
    df[&quot;変換失敗&quot;],
    [&quot;商品&quot;, &quot;売上_元データ&quot;, &quot;売上_清掃後&quot;]
]</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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_元データ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_清掃後</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">D</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">E</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
    </tr>
  </tbody>
</table>
</div>
<h2 id="nanを0で埋める前に意味を判断する"><span id="toc10">NaNを0で埋める前に意味を判断する</span></h2>

<p>変換失敗値の扱いは、文字の意味によって変わります。</p>

<div class="table-scroll">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr class="header">
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">元の値・状態</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">考えられる意味</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">推奨する確認</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">処理例</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;"><code>"-"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">売上なし、未入力、対象外など</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">入力ルールや作成者へ確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">売上なしと確認できた場合だけ0へ修正</td>
</tr>
<tr class="even">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;"><code>"不明"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">金額が分からない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">原票や入力元を確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">判明すれば修正、分からなければ欠損のまま</td>
</tr>
<tr class="odd">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">元からの欠損</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">未入力・取得失敗など</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">欠損理由を確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">必要に応じて<code>fillna()</code>等を検討</td>
</tr>
<tr class="even">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;"><code>"0"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">実際に売上0</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0が有効値か確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">有効なら0のまま保持</td>
</tr>
<tr class="odd">
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;"><code>"-300"</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">返品・取消など</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">負数が許される列か確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">正当なら負数のまま保持</td>
</tr>
</tbody>
</table>
</div>
<p>ここでは、業務ルールを確認した結果、<code>"-"</code>だけが「売上なし」を表すと仮定します。<code>"不明"</code>と元からの欠損は、根拠なく0にせずNaNのまま残します。</p>
<pre class="line-numbers"><code class="language-python">df[&quot;売上_確定&quot;] = df[&quot;売上_数値&quot;].copy()
df.loc[df[&quot;売上_元データ&quot;].eq(&quot;-&quot;), &quot;売上_確定&quot;] = 0

df[[&quot;商品&quot;, &quot;売上_元データ&quot;, &quot;売上_数値&quot;, &quot;売上_確定&quot;]]</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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">商品</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_元データ</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_数値</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">売上_確定</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">A</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1200</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">B</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1,500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">1500</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">C</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2,000円</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2000</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">D</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&#8211;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">E</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">不明</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">F</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">None</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">&lt;NA&gt;</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">G</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">H</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">-300</td>
    </tr>
  </tbody>
</table>
</div>
<p>商品Dだけが0へ修正され、<code>"不明"</code>の商品Eと元から欠損していた商品FはNaNのままです。0埋めはコード上できるかではなく、<strong>0と判断できる根拠があるか</strong>で決めます。</p>
<h2 id="集計前に件数欠損dtypeを確認する"><span id="toc11">集計前に件数・欠損・dtypeを確認する</span></h2>

<p>最後に、変換後のdtype、行数、数値として使える件数、欠損件数、合計、平均を確認します。</p>
<pre class="line-numbers"><code class="language-python">確認結果 = pd.Series({
    &quot;dtype&quot;: str(df[&quot;売上_確定&quot;].dtype),
    &quot;全行数&quot;: len(df),
    &quot;数値として使える件数&quot;: int(df[&quot;売上_確定&quot;].notna().sum()),
    &quot;欠損件数&quot;: int(df[&quot;売上_確定&quot;].isna().sum()),
    &quot;合計&quot;: float(df[&quot;売上_確定&quot;].sum()),
    &quot;平均&quot;: float(df[&quot;売上_確定&quot;].mean()),
}, name=&quot;結果&quot;)

確認結果</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; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc; background-color: #f2f2f2; font-weight: 700;">結果</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">dtype</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">Int64</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">全行数</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">8</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">数値として使える件数</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">6</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">欠損件数</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">合計</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">4400.0</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">平均</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em; border: 1px solid #ccc;">733.333333</td>
    </tr>
  </tbody>
</table>
</div>
<p>全8行のうち、数値として使えるのは6件、欠損は2件です。合計は4,400、平均は約733.33です。pandasの<code>sum()</code>や<code>mean()</code>は通常、欠損値を除いて計算するため、平均の分母は8件ではなく数値がある6件です。</p>

<p>商品Hの<code>-300</code>も合計と平均へ含まれています。負数が返品として正しいのか、入力ミスなのかを確認せずに集計結果を解釈してはいけません。</p>
<h2 id="自分のデータへ置き換えるときのチェックリスト"><span id="toc12">自分のデータへ置き換えるときのチェックリスト</span></h2>

<ul>
<li>対象の列名が正しいか</li>
<li>
<code>info()</code>や<code>dtype</code>で変換前の型を確認したか</li>
<li>元からの欠損数を記録したか</li>
<li>カンマ、通貨記号、前後空白、全角数字、小数点、負数の表記を確認したか</li>
<li>0、未入力、不明、対象外がそれぞれ何を意味するか</li>
<li>元列を残したまま変換結果を検証したか</li>
<li>
<code>coerce</code>後に増えたNaNの件数と元値を確認したか</li>
<li>変換後のdtype、行数、欠損数、最小値・最大値に違和感がないか</li>
</ul>

<p>特に、<code>coerce</code>でエラーが出なかったことを「全件正しく変換できた」と解釈しないでください。</p>
<h2 id="数値化した後の分析へつなげる"><span id="toc13">数値化した後の分析へつなげる</span></h2>

<p>数値化と失敗値の確認が終わったら、次の順で分析へ進めます。</p>

<ol type="1">
<li>欠損の意味を確認し、必要なら<a href="https://pythondatalab.com/pandas-fillna/"><code>fillna()</code></a>等で処理する</li>
<li>
<a href="https://pythondatalab.com/pandas-info-describe/"><code>describe()</code></a>で件数・平均・最小値・最大値を確認する</li>
<li>
<a href="https://pythondatalab.com/pandas-groupby-agg/"><code>groupby()</code>と<code>agg()</code></a>で商品・店舗・月などの単位に集計する</li>
<li>必要に応じてグラフで可視化する</li>
</ol>

<p><code>to_numeric()</code>は集計そのものではなく、<strong>正しく集計できる列を作る前処理</strong>です。変換後の値を確認してから次の工程へ進みましょう。</p>
<h2 id="まとめ"><span id="toc14">まとめ</span></h2>

<ul>
<li>文字列の数値を変換するには<code>pd.to_numeric()</code>を使う</li>
<li>値が整っていて型を明示するなら<code>astype()</code>、不正値を探しながら変換するなら<code>to_numeric()</code>を選ぶ</li>
<li>既定の<code>errors="raise"</code>は不正値で停止し、<code>errors="coerce"</code>は不正値をNaNにする</li>
<li>
<code>errors="coerce"</code>は自動修正ではないため、NaNになった元値を必ず確認する</li>
<li>カンマや「円」は規則を確認して変換前に清掃する</li>
<li>元からの欠損と変換失敗を分け、0・欠損・不明・負数を同一視しない</li>
<li>dtype・件数・欠損数を確認してから、欠損処理や集計へ進む</li>
</ul>

<p>大切なのは、変換コードを実行することではなく、<strong>変換で何が変わり、何が失われた可能性があるかを読めること</strong>です。</p>
<h2 id="関連記事"><span id="toc15">関連記事</span></h2>

<ul>
<li><a href="https://pythondatalab.com/pandas-info-method/">pandas
info()の使い方｜Non-Null Count・データ型・欠損値の見方</a></li>
<li><a href="https://pythondatalab.com/pandas-astype/">pandas
astype()の使い方｜文字列・整数・小数の型変換とエラー対処</a></li>
<li><a href="https://pythondatalab.com/pandas-replace/">pandas
replace()の使い方｜値の置換・表記ゆれ・欠損値変換を解説</a></li>
<li><a href="https://pythondatalab.com/pandas-str-strip/">pandas
str.strip()の使い方｜文字列・列名の前後空白を削除</a></li>
<li><a href="https://pythondatalab.com/pandas-fillna/">pandas
fillna()の使い方｜欠損値を0・平均値・中央値で埋める方法</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-read-excel/">pandas
read_excel()の使い方｜Excelファイル読み込み・sheet_name・usecolsを解説</a></li>
<li><a href="https://pythondatalab.com/pandas-info-describe/">pandas
describe()の使い方｜統計量の意味と結果の見方を解説</a></li>
<li><a href="https://pythondatalab.com/pandas-groupby-agg/">Pandas
groupby×aggの使い方｜基本の集計と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="toc16"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>
</div>
<script>Prism.highlightAll();</script>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1788070096148" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc17">to_numeric()とastype()はどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p>値がすべて整っていて、<code>int</code>など変換先の型を明示したい場合は<code>astype()</code>が分かりやすい方法です。不正な文字が混ざる可能性があり、変換できない値をNaNとして発見したい場合は<code>pd.to_numeric(..., errors="coerce")</code>を選びます。</p>

</div>
</div>
<div id="faq-question-1788070110062" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc18">errors=&#8221;ignore&#8221;は現在も使えますか？</span></h3>
<div class="rank-math-answer ">

<p>新しいコードでは使わないでください。古いpandasでは入力全体をそのまま返す挙動で誤解されやすく、pandas 2.2で非推奨となりました。確認したpandas 3.0系の公式APIでは、<code>errors</code>の選択肢は<code>raise</code>と<code>coerce</code>です。</p>

</div>
</div>
<div id="faq-question-1788070120235" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc19">coerce後にNaNになった行だけを確認するには？</span></h3>
<div class="rank-math-answer ">

<p>変換後の列へ<code>isna()</code>を使い、元の列が欠損でなかった条件と組み合わせます。この記事の<code>変換失敗</code>列がその判定です。元列も一緒に表示すると、カンマ、記号、不明値などの原因を確認できます。</p>

</div>
</div>
<div id="faq-question-1788070131935" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc20">変換後が整数型ではなくfloat64などになるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>小数やNaNを含む場合、整数だけの列とは異なるdtypeになることがあります。入力のdtypeやpandasのバージョンによってNullable整数型になる場合もあるため、型名を決めつけず、実際の<code>dtype</code>を確認してください。</p>

</div>
</div>
<div id="faq-question-1788070142241" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">DataFrameの複数列をまとめてto_numeric()へ渡せますか？</span></h3>
<div class="rank-math-answer ">

<p><code>pd.to_numeric()</code>は主にSeriesなど1次元データへ使います。複数列は対象列を選んで列ごとに適用できますが、この記事では事故を防ぐため1列ずつ元値と結果を確認する方法に絞っています。</p>

</div>
</div>
<div id="faq-question-1788070151828" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">カンマ・円・全角数字はそのまま変換できますか？</span></h3>
<div class="rank-math-answer ">

<p>常に変換できるとは限りません。カンマや「円」は表記規則を確認してから除去します。全角数字や海外形式の桁区切り・小数点は、データの規則に合わせた正規化が別途必要です。</p>

</div>
</div>
<div id="faq-question-1788070161653" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">変換後のNaNを0で埋めてもよいですか？</span></h3>
<div class="rank-math-answer ">

<p>NaNが本当に「売上なし」を意味すると確認できる場合だけです。「不明」や取得失敗を0にすると分析結果が変わります。元値と業務上の意味を確認し、0への修正、欠損のまま保持、正しい値への修正、除外から選びます。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</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-to-numeric/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
