Pandas 删除任何字符串的行

Pandas remove rows which any string

一个非常基本的 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: cannot index with vector containing NA / NaN values

你能:

这样做:

import re
regex = re.compile("[a-zA-Z]+")
df.ix[df.col1.map(lambda x: regex.search(x) is None)]

另一个更快的解决方案boolean indexing and condition with to_numeric where parameter errors='coerce' means if data are not numeric are converted to NaN - so you need find all not NaN data by 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

您的解决方案:

我认为你需要通过 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