与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
您的解决方案:
我想你需要转换为str
由astype
,然后添加[]
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
所以我没有这样的: 'input_.ix [input_.Col1.map(拉姆达X:regex.search(x)是无)]' 并得到错误: 'TypeError:预期的字符串或缓冲区' – spiff
因为我不知道col1的类型,所以我认为它是字符串并执行该过程。如果不是,它会引发这样的例外。你可以这样做: df.ix [df.col1.map(lambda x:regex.search(str(x))is None)] 将col1转换为字符串类型并再次运行。 – Howardyan
热潮!这是做到了 - 谢谢vm。我可以问你为什么我的方式不起作用吗? – spiff