1. ホーム
  2. python

pandasでdataframeの非数値行を見つける?

2023-12-17 21:06:50

質問

pandasに大きなデータフレームがあり、インデックスとして使用されている列は別として、数値のみを持つことになっています。

df = pd.DataFrame({'a': [1, 2, 3, 'bad', 5],
                   'b': [0.1, 0.2, 0.3, 0.4, 0.5],
                   'item': ['a', 'b', 'c', 'd', 'e']})
df = df.set_index('item')

データフレームの行を見つけるにはどうしたらよいでしょうか? df の行で、数値以外の値を持つ行を見つけるにはどうしたらよいでしょうか?

この例では、データフレームの4行目にある、文字列 'bad' の中に a という列があります。この行をプログラム的に見つけるにはどうしたらよいでしょうか。

どのように解決するのですか?

あなたは np.isreal で各要素の型を確認することができます ( 適用マップ はDataFrameの各要素に関数を適用します)。

In [11]: df.applymap(np.isreal)
Out[11]:
          a     b
item
a      True  True
b      True  True
c      True  True
d     False  True
e      True  True

行のすべてがTrueの場合、それらはすべて数値です。

In [12]: df.applymap(np.isreal).all(1)
Out[12]:
item
a        True
b        True
c        True
d       False
e        True
dtype: bool

ということで、ルージュのsubDataFrameを取得するために、(注:上記の否定である〜は、少なくとも1つのルージュ非数字を持つものを見つけます)。

In [13]: df[~df.applymap(np.isreal).all(1)]
Out[13]:
        a    b
item
d     bad  0.4

の場所を探すこともできます。 最初 を使用することができます。 argmin :

In [14]: np.argmin(df.applymap(np.isreal).all(1))
Out[14]: 'd'

として CTZhu の方が若干速いかもしれません。 のインスタンスであるかどうかをチェックするのは のインスタンスであるかどうかをチェックする方がわずかに速いかもしれません(np.isrealによるいくつかの追加のオーバーヘッドがあります)。

df.applymap(lambda x: isinstance(x, (int, float)))