一个非常基本的qs家伙 - 想看看vm。我想删除Col1
中包含任何字符串的行 - 只关注Col1
中的数值。
输入:
Col1 Col2 Col3
0 123 48.0 ABC
1 45 85.0 DEF
2 A.789 66.0 PQR
3 RN.35 9.0 PQR
4 LMO 12.0 ABC
输出:
Col1 Col2 Col3
0 123.0 48.0 ABC
1 45.0 85.0 DEF
我试过
test = input_[input_['Col1'].str.contains(r'ABCDEGGHIJKLMNOPQRSTUVWXYZ.')]
但是看到这个错误
ValueError:无法使用包含NA / NaN值的向量进行索引
你可以:
答案 0 :(得分:4)
这样做:
import re
regex = re.compile("[a-zA-Z]+")
df.ix[df.col1.map(lambda x: regex.search(x) is None)]
答案 1 :(得分:2)
使用boolean indexing
和to_numeric
条件的另一个更快的解决方案,其中参数errors='coerce'
表示如果数据不是数字,则转换为NaN
- 因此您需要找到所有不NaN
的{{1}} 1}}数据notnull
:
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