根据标题名称类型删除列



通常,当您想要删除非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不是floatint,我如何删除它?

如果您想删除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( 确保只保留floatint类型:

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";。

最新更新