Python 熊猫删除任何字符串都不可用的行

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

一个非常基本的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  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!成功了-谢谢你。。我可以问你为什么我的方法行不通吗?我的建议是《圣经》。我们不需要深入探究为什么它是错误的,我们只需要知道如何以正确的方式进行。我还添加了解决方案的时间安排,什么是公认的解决方案更快;)我还添加了您的解决方案的时间安排,即公认的解决方案的速度;)