Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでpandasのSeriesから整数要素のみを抽出・フィルタリングする方法


文字列と整数が混在するpandasのSeriesから、整数要素のみを抽出する方法を、2つの異なるアプローチで解説します。

入力データと期待される出力

入力 ― 次のようなSeriesを想定します。

0    1
1    2
2    python
3    pandas
4    3
5    4
6    5

出力 ― 整数要素のみを抽出した結果は以下の通りです。

0    1
1    2
4    3
5    4
6    5

解法1:type()でデータ型を判定する

  • pandasのSeriesを定義します。

  • forループとitems()メソッドでインデックスと値を順番に取り出し、type()関数で各値がint型かどうかを判定します。

  • 条件を満たす要素(整数)だけをインデックス付きで出力します。

実装例

以下のコードで動作を確認してみましょう。

import pandas as pd

ls = [1, 2, "python", "pandas", 3, 4, 5]
data = pd.Series(ls)

for i, j in data.items():
    if type(j) == int:
        print(i, j)

出力

0    1
1    2
4    3
5    4
6    5

この方法はシンプルで直感的です。なお、よりPythonicな書き方としては isinstance(j, int) を使うのもおすすめです。

解法2:正規表現とfilter()を組み合わせる

  • lambda式の中で正規表現 \d+(1桁以上の数字)にマッチするかどうかを判定します。

  • re.match()は文字列にしか適用できないため、str(x)ですべての要素を文字列に変換してから評価します。

  • 最後に isin() 関数を使い、元のSeriesから該当する値を持つ行だけを抽出します。

実装例

import pandas as pd
import re

ls = [1, 2, "python", "pandas", 3, 4, 5]
data = pd.Series(ls)

result = pd.Series(filter(lambda x: re.match(r"\d+", str(x)), data))
print(data[data.isin(result)])

出力

0    1
1    2
4    3
5    4
6    5

まとめ

型チェックによる方法はコードが読みやすく、厳密にint型だけを対象にできるのが特徴です。一方、正規表現を使う方法は柔軟性が高い反面、「123」のような数字のみで構成された文字列もマッチしてしまう点に注意が必要です。目的やデータの性質に応じて、2つの方法を使い分けるとよいでしょう。

  1. 【Python】特定の範囲の要素をまとめて更新するプログラムの書き方

    数値のリスト nums と操作のリスト operations が与えられているとします。各操作は [L, R, X] という3つのフィールドを持ち、「インデックス L から R まで(両端を含む)のすべての要素に X を加算する」という意味です。すべての操作を適用し、最終的なリストを返すのがこの問題の目的です。 問題の例 たとえば、入力が次のような場合を考えてみましょう。 nums = [8, 4, 2, -9, 4] operations = [[0, 0, 3], [1, 3, 2], [2, 3, 5]] このときの出力は [11, 6, 9, -2, 4] になります。初期リストが [

  2. Pythonで整数配列の重複を除去し、個別の要素だけを出力する方法

    整数型の配列が与えられ、その中には重複した要素が含まれている場合があります。この記事では、重複を取り除いて個別(ユニーク)な値だけを出力するPythonプログラムを解説します。 実行例 入力:A = [1, 2, 3, 4, 2, 3, 5, 6] 出力:[1, 2, 3, 4, 5, 6] アルゴリズム このプログラムは次の手順で動作します。 配列の要素を入力として受け取ります。 各要素を先頭から順番に1つずつ取り出します。 取り出した要素が、それ以前にすでに出力されたものかどうかを確認します。 初期値0のフラグ変数を用意し、すでに表示済みなら1、未表示なら0のままにします。 フラ