Pandas删除任何字符串的行

时间:2016-10-04 02:30:27

标签: python string pandas indexing numeric

一个非常基本的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值的向量进行索引

你可以:

  • 简要说明为什么不起作用?
  • 替代解决方案是什么?

2 个答案:

答案 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 indexingto_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