PythonでExcelの表から条件に合う行を抽出する手順|pandasで複数の条件を組み合わせる
Excelの表から条件に合う行だけを、Pythonのpandasで取り出す手順を解説します。複数の条件を&と|でつなぐときの括弧、isinで候補の一覧から選ぶ方法、文字の金額や空欄でつまずく点を、架空のデータで試した結果とともに紹介します。
目次
この記事でわかること
- Excelの表から、1つの条件に合う行を取り出す方法
- 「金額が1万円以上で、店舗が本店」のように、複数の条件を組み合わせる書き方
- 候補の一覧(店舗名のリストなど)に入っている行を選ぶ方法(isin)
- 取り出した行数を元の表と比べて確かめ、別のファイルに保存する手順
売上や作業の記録の表から、「金額が大きいものだけ」「特定の店舗だけ」を取り出したい場面はよくあります。Excelのフィルターでもできますが、毎月同じ条件で取り出すなら、Pythonで書いておくと手間が減ります。ここでは、pandasで条件に合う行を取り出すやり方を、作り物の売上の表で実際に試した結果を添えて紹介します。
条件の書き方の根拠は、pandas 3.1.0の公式のユーザーガイドとAPIリファレンスです(2026年10月30日に原文で確認)。例に使う日付・店舗・担当・金額は、どれもこの記事のために作った値です。
先に結論: 条件は1つずつ括弧で囲み、&と|でつなぐ
先に結論を書くと、条件は1つずつ括弧で囲み、「かつ」は&、「または」は|でつなぎます。 店舗のように候補が決まっている列はisinで選び、取り出した後は行数を数えて、元の表と比べます。
| やりたいこと | 使う記号 |
|---|---|
| かつ | & |
| または | 縦棒の記号 |
| ではない | ~ |
| 一覧に入る | isin |
1つの条件で行を取り出す
表の列に比べる式を書くと、行ごとに「当てはまる・当てはまらない」の並びができます。pandasの資料では、この真偽の並びで行を選ぶ方法をBoolean indexingと呼んでいます。df[df["金額"] >= 10000]と書くと、金額が1万円以上の行だけが残ります。
複数の条件を組み合わせる
条件をつなぐ記号は、「または」が|、「かつ」が&、「ではない」が~です。pandasの資料では、これらでつなぐ条件は括弧でまとめる必要があるとしています。括弧が無いと、Pythonは数と記号の組み合わせを先に計算してしまい、意図した順番で比べられません。
andやorは使いません。pandasの資料によると、pandasの値を真か偽の1つにまとめようとすると、どちらとも決められないためエラーになります。
候補の一覧に入っている行を選ぶ(isin)
店舗名のように、取り出したい値がいくつか決まっているときは、isinを使います。pandasの資料では、isinは渡した一覧に値が含まれる位置を真にした並びを返すとしています。df["店舗"].isin(["本店", "駅前店"])のように書き、ほかの条件と&でつなげます。
queryで同じ条件を書く
queryを使うと、条件を文字の式で書けます。pandasの資料では、queryを「真偽の式で列を絞り込む」働きとしています。式の中の比べる記号は&や|より先に計算されるので、括弧を省いて書けます。ただし、資料は、利用者が入力した文字をそのままqueryに渡すと、意図しない処理が動くおそれがあると注意しています。
手順: 売上の表から条件に合う行を別のファイルに書き出す
次のコードは、架空の売上の表 sales.xlsx(日付・店舗・担当・金額の4列)を読み込み、金額が1万円以上で、店舗が本店か駅前店の行を取り出します。取り出した行はsales_picked.xlsxとして書き出し、sales.xlsxは書き換えません。自分の表で使うときは、列の名前と条件の値を書き換えてから動かします。
import pandas as pd
# 売上の表を読み込む(sales.xlsx そのものは変えない)
sales = pd.read_excel("sales.xlsx")
print("全体:", len(sales), "行 / 金額の空欄:", sales["金額"].isna().sum())
# 条件は1つずつ括弧で囲み、「かつ」は & でつなぐ
shops = ["本店", "駅前店"]
picked = sales[(sales["金額"] >= 10000) & (sales["店舗"].isin(shops))]
picked = picked.reset_index(drop=True)
print("取り出した行:", len(picked), "行")
# 取り出した行を、別の名前で書き出す
picked.to_excel("sales_picked.xlsx", index=False)
動かす前に、pandasと、xlsxの読み書きに使うopenpyxlを入れておいてください。reset_indexは、取り出した後に飛び飛びになった行の番号を、0から振り直すために使っています。
実行した結果
架空の売上の表(8行。店舗は本店・駅前店・郊外店の3つ、金額に空欄1つ)で動かしました。
- 全体は8行で、金額の空欄は1つと数えられました
- 取り出したのは3行で、どれも金額が1万円以上で、店舗が本店か駅前店でした
- 金額が1万円以上でも郊外店の行と、本店でも1万円未満の行は、取り出されませんでした
- 書き出したsales_picked.xlsxを読み直すと3行で、読み込んだsales.xlsxのほうは実行の前後でバイト単位で同じでした
- 同じ条件をqueryで書いた場合も、同じ3行が取り出されました
試した環境: Macの作業PC・Python 3.12.15・pandas 3.1.0・openpyxl 3.1.5。
自分で直すか、相談するかの判断
判断の目安は、「取り出す条件を、言葉で説明できるか」です。「1万円以上」「本店と駅前店」のように条件がはっきりしていれば、自分でコードに書いて進められます。
「大口の取引」「主な店舗」のように、何をもって当てはまるとするかが人によって違う条件は、先に表を使う人と決めてから書きます。取り出した結果を見せて、漏れている行や余分な行がないかを確かめてもらうと安心です。
つまずきやすいところ
- 括弧を付け忘れる: 架空の表で、金額の条件とisinの条件を括弧なしで&でつなぐと、エラーにならないまま、金額のある7行がすべて取り出されました。店舗を==で比べる条件とつないだときは、エラーで止まりました。どちらも、条件を1つずつ括弧で囲めば正しく取り出せます
- andやorでつなぐ: andを使うと、「The truth value of a Series is ambiguous」というエラーで止まりました。&と|を使います
- 金額が文字として読まれている: 金額に「12,000」のようなカンマ付きの文字が入っていると、数と比べたところでエラーで止まりました。先に数値にそろえます。文字の整え方は、PythonでExcelの表の文字の前後の空白と全角・半角をそろえる手順で紹介しています
- 空欄の行が黙って外れる: 金額が空欄の行は、以上・未満のどちらの条件でも取り出されませんでした。空欄の見つけ方は、PythonでExcelの表の空欄を見つけて一覧にする手順にまとめています
- 行の番号が飛んだまま: 取り出した直後の表は、元の行の番号を持ったままでした。reset_index(drop=True)で振り直します
- 大きい順に並べて上位を取りたいとき: 条件で絞った後に金額の大きい順に並べる方法は、PythonでExcelの表を並べ替えて上位の行を取り出す手順で紹介しています
まとめ
- 条件は1つずつ括弧で囲み、「かつ」は&、「または」は|、「ではない」は~でつなぎます
- andやorは使わず、候補の一覧から選ぶときはisinを使います
- 金額が数値として読まれているかと、空欄の数を、取り出す前に確かめます
- 取り出した行数を数えて元の表と比べ、結果は別のファイルに書き出して元の表を残します
よくある質問
条件を2つつなぐと、エラーになったり思った行が出なかったりするのはなぜですか?
条件をそれぞれ括弧で囲んでいないことが多いです。pandasの資料では、&や|でつなぐ条件は括弧でまとめる必要があるとしています。架空の表で括弧を付けずに書くと、つなぐ条件によって、エラーで止まる場合と、エラーにならずに条件と違う行が取り出される場合がありました。
andやorで条件をつないではいけないのですか?
列どうしの条件をつなぐときは、andではなく&、orではなく|を使います。andやorを使うと、架空の表では「The truth value of a Series is ambiguous」というエラーで止まりました。
金額が空欄の行は、条件で取り出したときにどうなりますか?
空欄の行は、金額の条件に当てはまらない側に入ります。架空の表でも、金額が空欄の行は、以上・未満のどちらの条件でも取り出されませんでした。黙って数から外れるので、取り出す前に空欄の数を数えておきます。
queryで書くのと、括弧で書くのと、どちらがよいですか?
結果は同じです。架空の表で同じ条件をqueryで書くと、括弧で書いたときと同じ行が取り出されました。queryは文字で式を書く分だけ読みやすくなります。ただし、pandasの資料では、利用者が入力した文字をそのまま渡すと、意図しない処理が動くおそれがあると注意しています。
取り出した結果をExcelに書き出すと、元の表は変わりますか?
変わりません。記事のコードは元のファイルを読むだけで、取り出した行は別の名前のファイルに書き出します。試したときも、読み込んだsales.xlsxは実行の前後で同じでした。