2017-10-29 4 views
2

Seriesパンダでは、値の種類に基づいて系列をフィルタリングする方法は?

import pandas as pd 

s = pd.Series(['foo', 'bar', 42]) 

のように、私は「サブシリーズのすべての値が文字列である、 pd.Series(['foo', 'bar'])を取得したいと思い考えます。私はそうのようなブールインデックス作成を試してみた:

s[isinstance(s, str)] 

が、これは私がselect出くわしたこれまでの適当な方法のための私の検索で

KeyError: False

を与えますが、これは、ラベルに基準を課していませんその価値。この場合の値のタイプ(タイプ)に基づいてどのようにフィルタリングできますか?

答えて

2

使用applyまたはリスト内包表記:

感謝 Jon Clements♦、同じ
s[s.apply(lambda x: isinstance(x, str))] 

s[s.apply(isinstance, args=(str,))] 

s[[isinstance(x, str) for x in s]] 

すべての帰り:

0 foo 
1 bar 
dtype: object 

EDIT:これは推奨されません

、感謝cᴏʟᴅsᴘᴇᴇᴅpd.to_numeric

s[s.apply(type) == str] 
+0

を使用することができます。 'isinstance'はそれを行うのに推奨される方法です。 –

+0

うーん、なぜ?あなたはeplainできますか?私にとってそれはより洗練されています... – jezrael

+0

はい、[[isinstance(x、str)for x in s]] 'もhttps://stackoverflow.com/questions/35351629/how-do-iに記載されています。 -subset-a-pandas-data-frame-based-on-string-of-string-values。 –

1

少しトリック:項目が数値の場合

s[pd.to_numeric(s, errors='coerce').isnull()] 

0 foo 
1 bar 
dtype: object 

、それが正常にNaN(ない強制されます)、最終結果から削除されます。

1

私は上記のようにpd.to_numericを使用したいと思います。

また、あなたは私があなただったら== ... `、それはニシキヘビではありません`タイプ(...)の使用を提唱避けたいstr.isalpha

In [109]: s[s.str.isalpha().notnull()] 
Out[109]: 
0 foo 
1 bar 
dtype: object 
+0

私は、非strsがFalseの代わりにNaNを与える理由について不思議です、それは矛盾しています。 –

関連する問題