在 pandas python 列中获取非数字行

新手上路,请多包涵

我检查了这篇文章: 在熊猫数据框中查找非数字行? 但它并没有真正回答我的问题。

我的示例数据:

 import pandas as pd

d = {
 'unit': ['UD', 'UD', 'UD', 'UD', 'UD','UD'],
 'N-D': [ 'Q1', 'Q2', 'Q3', 'Q4','Q5','Q6'],
 'num' : [ -1.48, 1.7, -6.18, 0.25, 'sum(d)', 0.25]

}
df = pd.DataFrame(d)

它看起来像这样:

   N-D   num   unit
0  Q1  -1.48   UD
1  Q2   1.70   UD
2  Q3  -6.18   UD
3  Q4   0.25   UD
4  Q5   sum(d) UD
5  Q6   0.25   UD

我只想过滤掉“num”列中非数字的行。我只希望所有列都包含列“num”的非数字值的行。

期望的输出:

   N-D   num   unit
4  Q5   sum(d) UD

我的尝试:

 nonnumeric=df[~df.applymap(np.isreal).all(1)] #didn't work, it pulled out everything, besides i want the condition to check only column 'num'.

nonnumeric=df['num'][~df.applymap(np.isreal).all(1)] #didn't work, it pulled out all the rows for column 'num' only.

原文由 Jessica 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

boolean indexingto_numeric + isnull 创建的掩码一起使用

注意:此解决方案不会查找或过滤保存为字符串的数字:如“1”或“22”

 print (pd.to_numeric(df['num'], errors='coerce'))
0   -1.48
1    1.70
2   -6.18
3    0.25
4     NaN
5    0.25
Name: num, dtype: float64

print (pd.to_numeric(df['num'], errors='coerce').isnull())
0    False
1    False
2    False
3    False
4     True
5    False
Name: num, dtype: bool

print (df[pd.to_numeric(df['num'], errors='coerce').isnull()])
  N-D     num unit
4  Q5  sum(d)   UD

另一个解决方案 isinstanceapply

 print (df[df['num'].apply(lambda x: isinstance(x, str))])
  N-D     num unit
4  Q5  sum(d)   UD

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

旧主题,但如果数字已转换为“str”,则 type(x) == str 不起作用。

相反,最好使用 isnumeric() 或 isdigit()。

 df = df[df['num'].apply(lambda x: not x.isnumeric())]

我在自己的 200k+ 行数据帧上测试了所有三种方法,假设数字已被 pd.read_csv() 转换为“str”。

 def f1():
    df[pd.to_numeric(df['num'], errors='coerce').isnull()]

def f2():
    df[~df.num.str.match('^\-?(\d*\.?\d+|\d+\.?\d*)$')]

def f3():
    df[df['num'].apply(lambda x: not x.isnumeric())]

通过运行每个函数 10 次,我获得了以下执行时间。

 timeit.timeit(f1, number=10)
1.04128568888882

timeit.timeit(f2, number=10)
1.959099448888992

timeit.timeit(f3, number=10)
0.48741375999998127

结论: 最快 的方法是isnumeric(), 最慢 的是正则表达式方法。

=========================================

编辑: 正如@set92 评论的那样,isnumeric() 仅适用于整数。因此,最快的适用函数是 pd.to_numeric() 以获得适用于任何类型数值的通用解决方案。

可以在 python 中定义一个 isfloat() 函数;但它会比内部函数慢,尤其是对于大数据帧。

 tmp=['4.0','4','4.5','1','test']*200000
df=pd.DataFrame(data=tmp,columns=['num'])

def f1():
    df[pd.to_numeric(df['num'], errors='coerce').isnull()]

def f2():
    df[df['num'].apply(lambda x: not isfloat(x))]

def f3():
    df[~df.num.str.match('^\-?(\d*\.?\d+|\d+\.?\d*)$')]

print('to_numeric:',timeit.timeit(f1, number=10))
print('isfloat:',timeit.timeit(f2, number=10))
print('regular exp:',timeit.timeit(f3, number=10))

结果:

 to_numeric: 8.303612694763615
isfloat: 9.972200270603594
regular exp: 11.420604273894583

原文由 Mehdi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题