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
一个非常基本的 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