当前位置: 首页 > 面试题库 >

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

农飞星
2023-03-14
问题内容

有一个像下面这样的数据框,它有一个不干净的列“ id”,它应该是数字列

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

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

tt,D
de,G

使数据框干净?

id, name
1,  A
2,  B
3,  C
4,  E
5,  F

问题答案:

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

import pandas as pd
from io import StringIO

data = """
id,name
1,A
2,B
3,C
tt,D
4,E
5,F
de,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的方法,它比与施加慢几乎两倍np.isnumericstr列。另外,我使用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)


 类似资料:
  • 问题内容: 我已经尝试解决这个问题一段时间了,我试图从DB_user列中删除非ASCII字符并尝试将它们替换为空格。但是我不断出错。这是我的数据框的外观: 我正在使用此功能,这是我在研究SO问题时遇到的。 我不断收到错误: 但是,我认为通过使用filter_func函数中的循环,可以通过在’ord’中输入一个char来解决这个问题。因此,当它遇到非ASCII字符时,应将其替换为空格。 有人可以帮我

  • df.审查: 目的是删除非英文行。我试过这个和这个,但都没用。下面的代码错误地将所有行标记为英语。

  • 我有以下数据帧: 我需要删除等于的行。最有效的方法是什么?

  • 现在我正在上一门机器学习课程。现在我应该导入我的数据集之后,我读了一个“CSV”文件导入我的数据集,我想删除一个列,但我不知道如何做。

  • 问题内容: 我对此有一个类似的问题:Pandas DataFrame:从一列中的字符串中删除不需要的部分 。 所以我用了: 大多数项目以“ PPI /”开头,但并非全部。似乎当没有’PPI /’后缀的项目遇到此错误时: AttributeError:“ float”对象没有属性“ lstrip” 我在这里想念什么吗? 问题答案: 使用replace: 或string.replace:

  • 问题内容: 我有一些数据,导入时会得到以下不需要的列,我正在寻找一种删除所有这些数据的简便方法 它们被0索引索引,所以我尝试了类似 但这不是很有效。我尝试编写一些for循环,但这使我感到震惊,因为熊猫的行为不佳。因此,我在这里问这个问题。 我已经看到了一些类似的示例(投递多列pandas),但这无法回答我的问题。 问题答案: 我不知道您所说的低效率是什么意思,但是如果您指的是打字,那么选择感兴趣的