【Pandas徹底解説】特定の条件を満たす要素数をカウントする方法(全体・行・列ごと)
データ分析において、「特定の条件を満たすデータがいくつあるか?」を把握することは非常に重要です。Pandasを使えば、DataFrameやSeriesの中から、特定の条件に合致する要素の数を効率的にカウントできます。この記事では、データセット全体、または行・列ごとに条件を満たす要素数をカウントする様々な方法を、短いサンプルコードと丁寧な解説を交えてご紹介します。
なぜ条件に合う要素数をカウントするのか?
特定の条件を満たす要素数をカウントする理由は多岐にわたります。
-
データの特徴把握: ある特定のカテゴリのデータがどれくらいあるか、異常値がどの程度含まれるかなどを把握できます。
-
品質チェック: データが期待通りの分布になっているか、エラーデータが混入していないかを確認できます。
-
分析の準備: 条件に基づいてデータをフィルタリングする前に、影響範囲を把握するのに役立ちます。
DataFrame/Series全体の条件を満たす要素をカウント
まずは、DataFrameやSeries全体の中で、特定の条件を満たす要素の数をカウントする方法から見ていきましょう。
ブールインデックス参照とsum()を使う
Pandasでは、条件式によって生成されるブール値(True/False)のSeriesやDataFrameに対してsum()メソッドを適用すると、Trueの数を合計できます。これは、Trueが1、Falseが0として扱われるためです。
import pandas as pd
import numpy as np
# サンプルDataFrameの作成
df = pd.DataFrame({
'A': [10, 20, 30, 20, 10],
'B': ['apple', 'banana', 'apple', 'orange', 'banana'],
'C': [True, False, np.nan, True, False]
})
print("オリジナルDataFrame:\n", df)
# 例1: 'A'列で値が20の要素数をカウント
count_a_20 = (df['A'] == 20).sum()
print(f"\n'A'列で20の要素数: {count_a_20}")
# 例2: 'B'列で'apple'の要素数をカウント
count_b_apple = (df['B'] == 'apple').sum()
print(f"'B'列で'apple'の要素数: {count_b_apple}")
# 例3: DataFrame全体で欠損値 (NaN) の数をカウント
# df.isnull()でブール値DataFrameを生成し、sum()を2回適用
total_nan_count = df.isnull().sum().sum()
print(f"DataFrame全体のNaNの数: {total_nan_count}")
解説:
-
df['A'] == 20: ‘A’列の各要素が20であるかを判定し、True/FalseのSeriesを生成します。 -
.sum(): そのSeriesのTrueの数を合計し、条件を満たす要素数を得ます。 -
DataFrame全体でNaNをカウントする場合も同様に、
df.isnull()でブール値DataFrameを生成し、sum()を2回適用して全体の合計を算出します。
DataFrameの行ごと・列ごとの条件を満たす要素をカウント
DataFrameの各行または各列において、特定の条件を満たす要素数をカウントすることも可能です。
各列の条件を満たす要素数をカウントする
df[条件式].sum()を使うと、各列において条件を満たす要素数をカウントできます。
# 各列で値が20の要素数をカウント(数値列のみ)
# df[df == 20] はDataFrameを返すので、そのsum()を取る
# NaNが含まれる場合は注意(sum()で無視される)
count_per_col = (df == 20).sum()
print(f"\n各列で値が20の要素数:\n{count_per_col}")
# 各列で'apple'の要素数をカウント(文字列列のみ)
count_per_col_str = (df == 'apple').sum()
print(f"\n各列で値が'apple'の要素数:\n{count_per_col_str}")
解説:
-
df == 20は、DataFrameの各要素が20であるかを判定するブール値DataFrameを生成します。 -
このブール値DataFrameに対して
.sum()を適用すると、各列のTrueの合計(つまり条件を満たす要素数)がSeriesとして返されます。数値以外の列では0になります。
各行の条件を満たす要素数をカウントする
各行の条件を満たす要素数をカウントするには、sum(axis=1)を使用します。
# 例: 各行で値が20の要素数をカウント
count_per_row_20 = (df == 20).sum(axis=1)
print(f"\n各行で値が20の要素数:\n{count_per_row_20}")
# 例: 各行で欠損値 (NaN) の数をカウント
nan_count_per_row = df.isnull().sum(axis=1)
print(f"\n各行のNaNの数:\n{nan_count_per_nan_row}")
解説:
-
df == 20はブール値DataFrameを生成します。 -
.sum(axis=1): 各行においてTrueの数を合計し、条件を満たす要素数を得ます。
より複雑な条件でカウントする
複数の条件を組み合わせたり、特定の範囲内の値をカウントしたりすることも可能です。
複数の条件を組み合わせる
論理演算子 (& (and), | (or), ~ (not)) を使って複数の条件を組み合わせることができます。
# 'A'列が20以上 AND 'B'列が'banana'の要素数(行数)をカウント
# 結果は条件を満たす行の数となる
count_combined = ((df['A'] >= 20) & (df['B'] == 'banana')).sum()
print(f"\n'A'列が20以上かつ'B'列が'banana'の要素数: {count_combined}")
解説:
-
各条件式を丸括弧
()で囲むことが重要です。 -
&演算子でAND条件、|演算子でOR条件を表現できます。
特定の範囲内の値をカウントする
between()メソッドや比較演算子を使って範囲を指定できます。
# 'A'列が15から25の間の要素数をカウント
count_between = df['A'].between(15, 25).sum()
print(f"\n'A'列が15~25の要素数: {count_between}")
まとめ
Pandasで特定の条件を満たす要素数をカウントする方法は、データ分析の多くのフェーズで役立ちます。sum()とブールインデックス参照を組み合わせることで、DataFrame全体、または行・列ごとのカウントを柔軟に行うことができます。さらに、複数の条件を組み合わせたり、between()のような便利なメソッドを活用することで、より詳細なデータ分析が可能になります。これらのテクニックをマスターして、あなたのデータ分析作業をより効率的かつ正確に進めましょう。
