从pandas DataFrame中删除非数字列

57

我的应用程序会加载结构如下的文本文件:

  • 第一列为非数字列(ID)
  • 多个非数字列(字符串)
  • 多个数字列(浮点数)

非数字列的数量是可变的。目前,我通过以下方式将数据加载到 DataFrame 中:

source = pandas.read_table(inputfile, index_col=0)
我想一次性删除所有非数字列,而不知道它们的名称或索引,因为可以通过读取其dtype来实现。在pandas中是否可能做到这一点,还是我必须自己想出一些方法?

相关链接:https://dev59.com/dF8f5IYBdhLWcg3wFvan - Bernhard
4个回答

71
为避免使用私有方法,您还可以使用select_dtypes,在其中您可以包含或排除所需的数据类型。

这个帖子中也遇到了相同的问题。

或者在您的情况下,具体地说:
source.select_dtypes(['number']) 或 source.select_dtypes([np.number])


3
我认为这比使用私有方法更好。也许你应该直接回答问题,即:source.select_dtypes(['number']) 或 source.select_dtypes([numpy.number])。 - hardsetting
1
这应该是被接受的答案,虽然另一个也可以工作,但这更正确,更不用说私有方法不是API的一部分,可能随时会改变。 - Juan Antonio Gomez Moriano
这个返回布尔值,不是吗? 另外,“number”和“np.number”有什么区别(只是一个包含数字的numpy数组吗?) - Worthy7

50

这是一个私有方法,但它可以解决问题:source._get_numeric_data()

In [2]: import pandas as pd

In [3]: source = pd.DataFrame({'A': ['foo', 'bar'], 'B': [1, 2], 'C': [(1,2), (3,4)]})

In [4]: source
Out[4]:
     A  B       C
0  foo  1  (1, 2)
1  bar  2  (3, 4)

In [5]: source._get_numeric_data()
Out[5]:
   B
0  1
1  2

2
谢谢!在pandas中使用“私有方法”时有什么注意事项吗?或者,为什么要将其设置为私有?(如果您建议的话,我可以开一个新问题。) - Richard Herron
2
一般来说,添加/删除/更改私有方法的API不被视为(类)API /行为更改。换句话说,被认为是向后兼容的pandas的新版本可以删除私有方法。我相信_get_numeric_data()主要用于支持绘图函数/方法。如果您认为这是一个有用的方法,您可以在GitHub上提出功能请求,要求将其作为公共API的一部分。 - Wouter Overmeire

0

这将删除不包含float64数字的每一列。

df = pd.read_csv('sample.csv', index_col=0)
non_floats = []
for col in df:
    if df[col].dtypes != "float64":
        non_floats.append(col)
df = df.drop(columns=non_floats)

3
您可以使用pd.api.types.is_numeric_dtype(df[col]) - Uzay Macar

-1

我还有另一种可能的解决方案,只需两行代码即可删除具有分类值的列,第一行定义一个包含分类值列的列表,第二行删除它们。df是我们的DataFrame。

在删除之前的df: df before dropping

  to_be_dropped=pd.DataFrame(df.categorical).columns
  df= df.drop(to_be_dropped,axis=1)

删除后的 df: 删除后的 df


3
不起作用:AttributeError: 'DataFrame'对象没有'categorical'属性 - information_interchange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接