この記事でわかること

  • 商品名のようなセルの文字数を、列ごとにまとめて数える方法(str.len)
  • 決めた上限を超える行だけを、別のファイルに書き出す書き方
  • 前後の空白・空欄・数字だけのセルで、数え方がずれる理由
  • 全角と半角、半角カタカナの濁点の数え方

ネットショップの商品名やWebページの見出しには、「20文字以内」のような長さの決まりがよくあります。Excelの一覧を1行ずつ見てLEN関数で確かめるのは、件数が多いと手間がかかります。この記事では、pandasで商品の一覧を読み込んで商品名の文字数の列を作り、上限を超えた行だけを別のファイルに出すところまでを、手元で試した結果とあわせて順に説明します。

参照したのは、pandas 3.1.0の公式の資料のうちSeries.str.len・Series.str.strip・Series.str.encodeの3つと、文字のデータの扱い方をまとめたユーザーガイドで、2026年11月4日に原文で確かめました。商品コードや商品名は、どれも試すために用意した架空のものです。

先に結論: 前後の空白を除いてからstr.lenで数え、上限と比べる

商品名の列にstr.strip().str.len()を使うと、行ごとの文字数の列ができます。 その列を上限の数と比べて、超えた行だけを選びます。空欄や数字だけのセルは数えられずに空(NaN)になるので、上限の確認とは別に拾います。

やりたいこと 書き方 試した一覧での結果
文字数を数える str.strip().str.len() 前後の空白つきの行が11文字から7文字に
上限を超える行を選ぶ 文字数の列 > 20 11行から2行
上限ちょうども含める 文字数の列 >= 20 3行
数えられなかった行を拾う 文字数の列.isna() 空欄と数字だけの2行

str.lenとstr.stripのしくみ

pandasの資料では、str.lenは列の要素ごとの長さを数えるもので、文字列なら文字の数を返すと説明しています。資料の例では、数字の5のような文字列でない値の結果はNaNになり、NaNが混ざるため、結果の列は小数の型(float64)になっています。

str.stripは、それぞれの文字列の左右の端から、空白(改行を含む)を取り除きます。資料には、文字列でない値はNaNに置きかえるとも書かれています。ユーザーガイドでも、strで使う文字列の処理は、空の値を自動で除いて扱うとしています。

1文字として数えられるもの

str.lenは、目に見える幅ではなく、文字の数を数えます。全角の「U」も半角の「U」も1文字です。前後や途中の空白、セルの中の改行も、それぞれ1文字に数えられます。半角カタカナの「ボ」は、「ホ」と濁点の「゙」の2文字です。

ショップや入力欄によっては、全角を2、半角を1として数える決まりもあります。その場合は、文字をバイトの並びに直すstr.encodeを先に使ってから長さを数えます。

手順: 商品の一覧から20文字を超える商品名を書き出す

次のコードは、架空の商品の一覧 shohin.xlsx を読み込み、商品名が20文字を超える行を shohin_chouka.xlsx に書き出します。元の shohin.xlsx は書きかえません。ファイルの名前・列の名前・上限の数は、自分の一覧に合わせて変えて使います。

import pandas as pd

limit = 20  # 商品名の上限の文字数
shohin = pd.read_excel("shohin.xlsx")  # 読むだけで、上書きはしない

# 前後の空白を除いてから、商品名の文字数を数える
shohin["文字数"] = shohin["商品名"].str.strip().str.len()
over = shohin[shohin["文字数"] > limit]

print("読み込んだ行:", len(shohin))
print(f"{limit}文字を超える行:", len(over))
print(over[["商品コード", "商品名", "文字数"]].to_string(index=False))
print("数えられなかった行:", shohin.loc[shohin["文字数"].isna(), "商品コード"].tolist())
over.to_excel("shohin_chouka.xlsx", index=False)

最後のprintでは、文字数がNaNになった行の商品コードを出しています。上限との比べ方では選ばれない行なので、件数と一緒に画面で見ておきます。pandasでxlsxを扱うので、openpyxlも入れておいてください。

試した結果

商品コードと商品名の2列で、データの行が11行の架空の一覧で動かしました。商品名には、前後に空白を2つずつ付けた「モニターアーム」、全角で書いた「USBハブ 4ポート」と半角で書いた「USBハブ 4ポート」、半角カタカナの「ワイヤレスキーボード」、ちょうど20文字の「ステンレス保温マグカップ 350ml蓋付」を入れ、1行は空欄、1行は数字の50210だけにしました。

  • 「読み込んだ行: 11」「20文字を超える行: 2」と表示されました
  • 選ばれたのは、22文字のノートPCスタンドと、26文字のポータブルSSDの2行でした
  • 「数えられなかった行: ['A-05', 'A-10']」と出ました。空欄の行と、数字だけの行です
  • 全角の「USBハブ 4ポート」も半角の「USBハブ 4ポート」も、同じ10文字でした
  • 「ワイヤレスキーボード」は、全角で書くと10文字の商品名ですが、12文字と数えられました
  • shohin_chouka.xlsx は3列・2行で、文字数の列は22と26でした
  • 実行の前後で shohin.xlsx のハッシュ値を比べ、同じであることを確かめました

試した環境は手元のMac(pandas 3.1.0、Python 3.12.15、openpyxl 3.1.5)です。書き出したファイルの中身は、Excelのアプリではなくopenpyxlで読み直して確かめました。

自分で直してよいか、相談するかの判断

目安は、「長さの決まりが、どの数え方で決まっているか」です。社内の一覧の見やすさのために自分で決めた上限なら、上のコードで見つけた行を自分で縮めてかまいません。

ショップや広告の入稿のように、相手の仕組みが文字数を数える場合は、全角と半角の扱い、空白や記号を数えるかどうかが、仕組みごとに違います。先に入稿先の決まりを確かめ、同じ数え方になっているかを、1件か2件を実際に入れて比べておきます。商品名を縮めるときは、検索で使われる語を消してよいかを、売り場の担当の人と相談します。

つまずきやすいところ

  • 前後の空白も数えられる: str.stripを付けずに数えると、前後に空白を2つずつ付けた「モニターアーム」は11文字になりました。stripの後は7文字です。見た目でわからない空白で上限を超えないよう、先に取り除きます
  • 空欄と数字だけのセルが確認から漏れる: 文字数がNaNになった空欄の行と50210の行は、「> 20」でも「<= 20」でも選ばれませんでした。isnaで別に拾います。数字も文字として数えたいときは、astype(str)で文字に直すと、50210は5文字と数えられました
  • 半角カタカナが長く数えられる: 「ワイヤレスキーボード」は、濁点の「゙」が別の1文字になるため12文字でした。半角カタカナを全角に直してから数えるなら、PythonでExcelの表の文字の前後の空白と全角・半角をそろえる手順で直せます
  • ちょうど上限の行が選ばれない: 「> 20」では、ちょうど20文字の保温マグカップは選ばれませんでした。上限ちょうどを「入りきらない」と扱う決まりなら、「>= 20」にします
  • 文字数が「22.0」のように小数になる: NaNの行が混ざると、文字数の列は小数の型になりました。書き出したファイルでは22と26の整数で入っていましたが、画面の表示では22.0になります
  • 空欄の行を先に調べたい: どの列のどの行が空欄かを先に洗い出すなら、PythonでExcelの表の空欄を見つけて一覧にする手順の手順が使えます
  • 長さで区分の列を付けたい: 「短い」「ちょうどよい」「長すぎる」のように、文字数の範囲で区分の列を作るなら、PythonでExcelの複数の条件から区分の列を作る手順のやり方が使えます

まとめ

  • 文字数は、str.strip().str.len()で前後の空白を除いてから数えます
  • 上限との比べ方(「>」か「>=」か)は、決まりに合わせて選びます
  • 空欄や数字だけのセルはNaNになるので、isnaで別に確かめます
  • 全角も半角も1文字です。全角を2と数える決まりなら、str.encodeでバイトに直して数えます