Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用熊猫删除一列中的非数字行_Python_Pandas - Fatal编程技术网

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

Python 使用熊猫删除一列中的非数字行,python,pandas,Python,Pandas,有一个如下所示的数据帧,它有一个不干净的列“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 假设df是您的数据帧 import numpy as np df[df['id'].apply(lambda x: isinstance(x, (int,

有一个如下所示的数据帧,它有一个不干净的列“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

假设
df
是您的数据帧

import numpy as np
df[df['id'].apply(lambda x: isinstance(x, (int, np.int64)))]
它所做的是将
id
列中的每个值传递给
isinstance
函数,并检查它是否为
int
。然后它返回一个布尔数组,最后只返回
True
所在的行

如果您还需要考虑
浮动
值,另一个选项是:

import numpy as np
df[df['id'].apply(lambda x: type(x) in [int, np.int64, float, np.float64])]
请注意,这两种方法都不适用,因此您需要将其重新指定给原始df,或创建一个新df:

df = df[df['id'].apply(lambda x: type(x) in [int, np.int64, float, np.float64])]
# or
new_df = df[df['id'].apply(lambda x: type(x) in [int, np.int64, float, np.float64])]

您可以使用字符串的标准方法,并将其应用于
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
的case未使用
apply
方法,但对于
str
列,其速度几乎是使用
np.isnumeric
的两倍。此外,我还添加了使用pandas的选项,与使用
pd.to\u numeric
相比,pandas的输入更少,速度更快。但是
pd.to_numeric
更通用,因为它可以处理任何数据类型(不仅仅是字符串)


使用
pd.to\u数值

In [1079]: df[pd.to_numeric(df['id'], errors='coerce').notnull()]
Out[1079]:
  id  name
0  1     A
1  2     B
2  3     C
4  4     E
5  5     F
x.isnumeric()
x
float
类型时,不测试返回值
True

筛选出可转换为浮点值的值的一种方法:

df[df['id'].应用(lambda x:is_float(x))]

def为浮点数(x):
尝试:
浮动(x)
除值错误外:
返回错误
返回真值
这个怎么样? .str访问器是我的最爱之一:)


如果希望将列保留为数字而不是对象,则可能需要分别调用
pd.\u numeric
。否
apply
:D!(它不在本地)我在Python2上测试了它,但是
pd.to\u numeric
isdigit()快<代码>%timeit subx1=sub[sub.BAN.apply(lambda x:str(x).isdigit())]
为5.67秒。与4.46秒相比,
%timeit subx2=sub[pd.to_numeric(sub.BAN,errors='concurve').notnull()]
。Python 2
str
在您的第一个示例中没有
isnumeric()
:我是否需要“inplace=True?”
In [1079]: df[pd.to_numeric(df['id'], errors='coerce').notnull()]
Out[1079]:
  id  name
0  1     A
1  2     B
2  3     C
4  4     E
5  5     F
import pandas as pd


df = pd.DataFrame(
    {
        'id':   {0: '1', 1: '2', 2: '3', 3: 'tt', 4: '4', 5: '5', 6: 'de'},
        'name': {0: 'A', 1: 'B', 2: 'C', 3: 'D',  4: 'E', 5: 'F', 6: 'G'}
    }
)

df_clean = df[df.id.str.isnumeric()]