Python 使用熊猫删除一列中的非数字行
有一个如下所示的数据帧,它有一个不干净的列“id”,它应该是数字列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, 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 2str
在您的第一个示例中没有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()]