加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用pandas删除一列中的非数字行

发布时间:2020-12-20 10:34:23 所属栏目:Python 来源:网络整理
导读:有一个如下所示的数据框,它有一个不干净的列’id’,它应该是数字列 id,name1,A2,B3,Ctt,D4,E5,Fde,G 是否有一种简洁的方法来删除行,因为tt和de不是数值 tt,Dde,G 使数据帧干净? id,C4,F 解决方法 您可以使用字符串 isnumeric 的标准方法并将其应用于id列中
有一个如下所示的数据框,它有一个不干净的列’id’,它应该是数字列

id,name
1,A
2,B
3,C
tt,D
4,E
5,F
de,G

是否有一种简洁的方法来删除行,因为tt和de不是数值

tt,D
de,G

使数据帧干净?

id,C
4,F

解决方法

您可以使用字符串 isnumeric的标准方法并将其应用于id列中的每个值:

import pandas as pd
from io import StringIO

data = """
id,G
"""

df = pd.read_csv(StringIO(data))

In [55]: df
Out[55]: 
   id name
0   1    A
1   2    B
2   3    C
3  tt    D
4   4    E
5   5    F
6  de    G

In [56]: df[df.id.apply(lambda x: x.isnumeric())]
Out[56]: 
  id name
0  1    A
1  2    B
2  3    C
4  4    E
5  5    F

或者如果你想使用id作为索引,你可以这样做:

In [61]: df[df.id.apply(lambda x: x.isnumeric())].set_index('id')
Out[61]: 
   name
id     
1     A
2     B
3     C
4     E
5     F

编辑.添加时间

虽然pd.to_numeric的情况不使用apply方法,但它几乎比为str列应用np.isnumeric慢两倍.此外,我添加了使用pandas str.isnumeric的选项,它更少输入,然后使用pd.to_numeric更快.但pd.to_numeric更通用,因为它可以使用任何数据类型(不仅仅是字符串).

df_big = pd.concat([df]*10000)

In [3]: df_big = pd.concat([df]*10000)

In [4]: df_big.shape
Out[4]: (70000,2)

In [5]: %timeit df_big[df_big.id.apply(lambda x: x.isnumeric())]
15.3 ms ± 2.02 ms per loop (mean ± std. dev. of 7 runs,10 loops each)

In [6]: %timeit df_big[df_big.id.str.isnumeric()]
20.3 ms ± 171 μs per loop (mean ± std. dev. of 7 runs,10 loops each)

In [7]: %timeit df_big[pd.to_numeric(df_big['id'],errors='coerce').notnull()]
29.9 ms ± 682 μs per loop (mean ± std. dev. of 7 runs,10 loops each)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读