2017-08-01 72 views
1

我在這裏提出問題時很新穎。但這裏是:熊貓:確定一個條目中的第一個字符是字母還是數字

我有一個DataFrame有一個名爲「id」的列。我正在尋找擺脫所有不以該字段中的字母開頭的行。 下面是我正在使用的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

一個選項是使用str.match;在這裏使用正則表達式[^ A-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()] 
#  id level personCode 
#2 018.9  3   3 
#5 440.0  6   232 
#7 000.00  8   56 
#8 000.00  9   998 

(或者df[~df.id.str[0].str.isalpha()],如果你喜歡的波浪線)。

+0

非常感謝。從字面上看,這正是我所期待的。我一直使用df [df.id.str [0] .isalpha()]。什麼原因爲什麼應該有另一個'.STR。'? – shahbubs

+0

更多的習慣比必要性。 – DyZ

相關問題