2017-08-01 17 views
1

ここで質問するのは初めてです。しかしここにあります:pandas:エントリの最初の文字が文字か数字かを識別する

"id"という列を持つDataFrameがあります。私はその列の文字で始まらないすべての行を取り除くために探しています。 以下は私が作業しているDataFrameの例です。

df=DataFrame({"level": [1,2,3,4,5,6,7,8,9,10], 
"personCode": [23,5,3,234,6567,232,67667,56,998,2456], 
"id": ["Z71.89","J06.9","018.9","F41.1","M72.2","440.0","L85.1","000.00","000.00","I48.91"]}) 

私は大規模なデータセットで作業していると私は最近、そのサイズのデータ​​フレームのループのために使用していだけでは不可能です。私は私がやっていることを達成するのに役立つベクトル化された文字列メソッドを知らない。私は基本的に "ID"列の各文字列の最初の文字のisalpha()のようなブール値を探しています。一度見つけたら、行全体を削除したい。

私は過去2日間この作業を進めずに作業しています...フィードバックは素晴らしいでしょう!ありがとう。

答えて

1

1つのオプションは、使用str.matchです。ここで非アルファ文字を一致させる正規表現[^-ZA-Z]を使用します。

df[df.id.str.match('[^a-zA-Z]')] 

#  id level personCode 
#2 018.9  3 3 
#5 440.0  6 232 
#7 000.00  8 56 
#8 000.00  9 998 

str.matchは廃止されているようですので、あなたが先頭を指定するアンカー^str.containsを使用することができます

df[df.id.str.contains('^[^a-zA-Z]')] 

#  id level personCode 
# 2 018.9  3 3 
# 5 440.0  6 232 
# 7 000.00  8 56 
# 8 000.00  9 998 

のナイーブタイミング:文字列の方法とサンプルデータとisalpha

%timeit df[df.id.str.contains('^[^a-zA-Z]')] 
#1000 loops, best of 3: 418 µs per loop 

%timeit df[-df.id.str[0].str.isalpha()] 
#1000 loops, best of 3: 576 µs per loop 
+1

ありがとう!これはまさに私が必要としていたものです。 – shahbubs

3

別のオプションは、最初の文字が英字でないかどうかをチェックすることです:(またはdf[~df.id.str[0].str.isalpha()]、あなたがチルダを好む場合)

df[-df.id.str[0].str.isalpha()] 
#  id level personCode 
#2 018.9  3   3 
#5 440.0  6   232 
#7 000.00  8   56 
#8 000.00  9   998 

+0

ありがとうございました。文字通りこれはまさに私が探していたものです。私はdf [df.id.str [0] .isalpha()]を使い続けました。別の '.str'が必要な理由は何ですか? – shahbubs

+0

必要以上に癖があります。 – DyZ

関連する問題