Python 熊猫删除任何字符串都不可用的行
一个非常基本的qs家伙-Than的虚拟机来看看。我想删除Python 熊猫删除任何字符串都不可用的行,python,string,pandas,indexing,numeric,Python,String,Pandas,Indexing,Numeric,一个非常基本的qs家伙-Than的虚拟机来看看。我想删除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
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值的向量进行索引
你能:
- 简要解释一下为什么这不起作用
- 请问替代方案是什么
- 这样做:
import re
regex = re.compile("[a-zA-Z]+")
df.ix[df.col1.map(lambda x: regex.search(x) is None)]
这样做:
import re
regex = re.compile("[a-zA-Z]+")
df.ix[df.col1.map(lambda x: regex.search(x) is None)]
另一个更快的解决方案是,使用where参数
errors='concurve'
和条件,这意味着如果数据不是数字,则将转换为NaN
——因此您需要通过以下方式查找所有非NaN
数据:
计时:
#[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
,然后添加[]
,最后添加参数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
然后需要通过~
反转布尔掩码并使用:
另一个更快的解决方案是,使用where参数
errors='concurve'
和条件,这意味着如果数据不是数字,则将转换为NaN
——因此您需要通过以下方式查找所有非NaN
数据:
计时:
#[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
,然后添加[]
,最后添加参数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
然后需要通过~
反转布尔掩码并使用:
所以我这样做:'input_ux.ix[input_x.Col1.map(lambda x:regex.search(x)is None)],并得到错误:'TypeError:expected string或buffer',因为我不知道Col1的类型,所以我假设它是string并执行该过程。如果不是,它将引发这样的异常。您可以这样做:df.ix[df.col1.map(lambda x:regex.search(str(x))为None)]将col1转换为字符串类型,然后再次运行它。boom!成功了-谢谢你。。我可以问你为什么我的方法行不通吗?我的建议是《圣经》。我们不需要深入探究为什么它是错误的,我们只需要知道如何以正确的方式进行操作。所以我这样做了:“input_ux[input_x.Col1.map(lambda x:regex.search(x)is None)],然后得到错误:“TypeError:expected string或buffer”,因为我不知道Col1的类型,所以我假设它是string并执行该过程。如果不是,它将引发这样的异常。您可以这样做:df.ix[df.col1.map(lambda x:regex.search(str(x))为None)]将col1转换为字符串类型,然后再次运行它。boom!成功了-谢谢你。。我可以问你为什么我的方法行不通吗?我的建议是《圣经》。我们不需要深入探究为什么它是错误的,我们只需要知道如何以正确的方式进行。我还添加了解决方案的时间安排,什么是公认的解决方案更快;)我还添加了您的解决方案的时间安排,即公认的解决方案的速度;)