通常,当您想要删除非float
类型的列时,可以编写pd.DataFrame.select_dtypes(include='float64')
。但是,如果标题名称不是浮动,我想删除一列
df = pd.DataFrame({'a' : [1,2,3], 10 : [3,4,5]})
df.dtypes
将给出输出
a int64
10 int64
dtype: object
如果列a
不是float
或int
,我如何删除它?
如果您想删除10
,请尝试使用正则表达式删除带数字的列
df.filter(regex='d', axis=1)
#On the contrary, you can drop nondigits too
# df.filter(regex='D', axis=1)
基于类型枚举的解决方案:
代码
sr_dtype = df.dtypes
df = df.drop(columns=sr_dtype.index[
sr_dtype.index.map(lambda el: not isinstance(el, (int, float))) # add more if necessary
])
注意,df.types
本身是可应用常规Series
操作的Series
实例。特别地,在本例中,index.map()
被用作isinstance()
检查的包装器。
结果
print(df)
10
0 3
1 4
2 5
你确定这是正确的输出吗?您的数据帧列是"a"和10,为什么您的输入有一个名为"b"的列?
无论如何,要删除列a
,无论其类型如何,而是通过其标头名称,请使用drop
方法:df = df.drop(columns=['a'])
也可以使用列列表,而不是本例中的单个元素列表。
根据其他答案,您也可以尝试:
1( 确保只保留float
和int
类型:
df[[col for col in df.columns if type(col) in [float,int]]]
2( 只排除类似字符串的列:
df.loc[:, [not isinstance(col, str) for col in df.columns]] # return bool array
# or
df[[col for col in df.columns if not isinstance(col, str)]] # return colum names
3( 基于正则表达式排除不是float
/int
的列:
df.filter(regex='^d+$|^d+?.{1}d+$')
其中第一表达式^d+$
映射整数(以数字开头和结尾(,而第二表达式^d+?.{1}d+$
映射浮点。我们可以只使用^[d|.]+$
(只允许数字和点(来映射它们,但它也会映射像"这样的列;1..2";。