另一个更快的解决方案boolean indexing 和to_numeric 条件,其中参数errors='coerce' 表示如果数据不是数字,则转换为NaN - 所以你需要通过notnull 找到所有不是NaN 的数据:
print (pd.to_numeric(df.Col1, errors='coerce'))
0 123.0
1 45.0
2 NaN
3 NaN
4 NaN
Name: Col1, dtype: float64
print (pd.to_numeric(df.Col1, errors='coerce').notnull())
0 True
1 True
2 False
3 False
4 False
Name: Col1, dtype: bool
df = df[pd.to_numeric(df.Col1, errors='coerce').notnull()]
print (df)
Col1 Col2 Col3
0 123 48.0 ABC
1 45 85.0 DEF
时间安排:
#[100000 rows x 3 columns]
df = pd.concat([df]*10000).reset_index(drop=True)
In [16]: %timeit (df.ix[df.Col1.map(lambda x: re.compile("[a-zA-Z]+").search(x) is None)])
10 loops, best of 3: 57.7 ms per loop
In [17]: %timeit (df[pd.to_numeric(df.Col1, errors='coerce').notnull()])
10 loops, best of 3: 22 ms per loop
In [18]: %timeit (df[~df['Col1'].astype(str).str.contains(r'[ABCDEGGHIJKLMNOPQRSTUVWXYZ.]', na=False)])
10 loops, best of 3: 38.8 ms per loop
您的解决方案:
我认为您需要通过astype 转换为str,然后添加[] used to indicate a set of characters 和最后添加参数na=False 因为似乎一些NaN 值在col1 中,然后转换为False:
print (df['Col1'].astype(str).str.contains(r'[ABCDEGGHIJKLMNOPQRSTUVWXYZ.]', na=False))
0 False
1 False
2 True
3 True
4 True
Name: Col1, dtype: bool
然后需要通过~ 反转布尔掩码并使用boolean indexing:
print (df[~df['Col1'].astype(str).str.contains(r'[ABCDEGGHIJKLMNOPQRSTUVWXYZ.]', na=False)])
Col1 Col2 Col3
0 123 48.0 ABC
1 45 85.0 DEF