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
# make dataframe of column data types
col_types = df.dtypes.to_frame()
col_types.columns = ['dtype']
#make list of zeros
drop_it = [0]*col_types.shape[0]
k = 0
#make it a one if the data isn't numeric
#if you have other numeric types you need to add them to if statement
for t in col_types.dtype:
if t != 'int64' and t != 'float64':
drop_it[k] = 1
k = k + 1
#delete types from drop list that aren't numeric
col_types['drop_it'] = drop_it
col_types = col_types.loc[col_types["drop_it"] == 1]
#finally drop columns that are in drop list
for col_to_drop in col_types.index.values.tolist():
df = df.drop([col_to_drop], axis = 1)
8条答案
按热度按时间scyqe7ek1#
使用
pd.to_numeric
f5emj3cl2#
你可以使用字符串
isnumeric
的标准方法,并将其应用于id
列中的每个值:或者如果你想使用
id
作为索引,你可以这样做:编辑,添加计时
虽然
pd.to_numeric
的case没有使用apply
方法,但它比对str
列应用np.isnumeric
慢了近两倍。我还添加了使用pandasstr.isnumeric
的选项,这比使用pd.to_numeric
输入更少,速度更快。但pd.to_numeric
更通用,因为它可以处理任何数据类型(不仅是字符串)。ojsjcaue3#
假设
df
是您的 Dataframe ,它所做的是将
id
列中的每个值传递给isinstance
函数,并检查它是否是int
。然后它返回一个布尔数组,最后只返回存在True
的行。如果您还需要考虑
float
值,另一个选项是:请注意,这两种方式都不合适,因此您需要将其重新分配给原始df,或者创建一个新的df:
unhi4e5o4#
当
x
的类型为float
时,x.isnumeric()
不会测试返回值True
。有一种方法可以过滤掉可以转换为
float
的值:df[df['id'].apply(lambda x: is_float(x))]
zxlwwiss5#
这个怎么样?
.str
访问器是我的最爱之一:)如果
id
包含某种令人头痛的数据类型(例如float
、None
、nan
),您可以使用astype('str')
将它们强制转换为str
数据类型。原始的,但它的工作无论如何。
lmyy7pcs6#
这是一种动态的方法,它只适用于int64和float 64,如果你的dataframe中有其他数值数据类型,请确保将它们添加到if语句中。
mctunoxg7#
另一种方法是使用
query
方法:lyr7nygr8#
系统对象处理异常:'无法访问已释放的对象。对象名称:'IServiceProvider'.'
尝试删除bin文件夹并重新构建它。这对我很有效。