【问题标题】:How do I find numeric columns in Pandas?如何在 Pandas 中找到数字列?
【发布时间】:2014-09-22 06:15:00
【问题描述】:

假设df 是一个熊猫数据框。 我想找到所有数字类型的列。 比如:

isNumeric = is_numeric(df)

【问题讨论】:

  • 您应该指定具有dtypeobject 但所有元素均为数字的列是否计为数字。如果不是,请采用 Hanan 的答案,因为它也更快。否则,拿走我的。
  • 如果你简单地尝试 df.describe().columns 会发生什么。然后将其分配给一个变量。
  • 相关:Get list of pandas dataframe columns based on data type。然后你只需要列出整数和浮点类型到df.select_dtypes(include=[...])

标签: python types pandas


【解决方案1】:

您可以使用 DataFrame 的select_dtypes 方法。它包括两个参数 include 和 exclude。所以 isNumeric 看起来像:

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']

newdf = df.select_dtypes(include=numerics)

【讨论】:

  • 如果您不需要指定“数字”列表,可以使用 df.select_dtypes(include=[np.number])
  • 在上一条评论 (+1) 中的提示的基础上,您可以使用 list(df.select_dtypes(include=[np.number]).columns.values) 获取数字列的名称列表
  • 相反,带有字符串匹配的经典过滤器性能更高(已测量):list(filter(lambda x: 'float' not in str(df.dtypes[x]) and 'int' not in str(df.dtypes[x]), df.columns))
  • 如果你想要列名list(df.select_dtypes('number'))(来自 pandas v1.0.0)
  • 这个答案看起来已经过时了。 2022 年,“要选择所有数字类型,请使用 np.number'number'”,来自 pandas.pydata.org/docs/reference/api/…
【解决方案2】:

创建仅包含数字列的新数据框的简单单行答案:

df.select_dtypes(include=np.number)

如果你想要数字列的名称:

df.select_dtypes(include=np.number).columns.tolist()

完整代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': range(7, 10),
                   'B': np.random.rand(3),
                   'C': ['foo','bar','baz'],
                   'D': ['who','what','when']})
df
#    A         B    C     D
# 0  7  0.704021  foo   who
# 1  8  0.264025  bar  what
# 2  9  0.230671  baz  when

df_numerics_only = df.select_dtypes(include=np.number)
df_numerics_only
#    A         B
# 0  7  0.704021
# 1  8  0.264025
# 2  9  0.230671

colnames_numerics_only = df.select_dtypes(include=np.number).columns.tolist()
colnames_numerics_only
# ['A', 'B']

【讨论】:

  • df.select_dtypes(include=['int64']).columns.tolist()
  • 如果只需要一种类型,则不需要将其存储在列表中。您也不需要指定include=select_dtypes(np.number)
  • 如果您的列有数字数据但也有无,则 dtype 可能是“对象”。这会将列强制转换为数字:df.fillna(value=0, inplace=True)
  • 还有:df.select_dtypes('number')。它甚至更短,您不必导入 numpy
【解决方案3】:

您可以使用未记录的函数_get_numeric_data() 仅过滤数字列:

df._get_numeric_data()

例子:

In [32]: data
Out[32]:
   A  B
0  1  s
1  2  s
2  3  s
3  4  s

In [33]: data._get_numeric_data()
Out[33]:
   A
0  1
1  2
2  3
3  4

请注意,这是一种“私有方法”(即实现细节),将来可能会发生更改或完全删除。 谨慎使用

【讨论】:

  • 超级好用;这在任何地方都有记录吗?担心它在未来的版本中消失和/或不稳定,如its prefix underscore indicates that it's meant to be private.
  • 不,这在任何地方都没有记录。实现是here,但是,就像@ijoseph 提到的那样,我会警惕使用以下划线开头的方法,因为它们只不过是实现细节。使用除此之外的任何其他答案。
  • 没错。作为最佳实践,我尝试使用并转换为尽可能多的 numpy 方法。这是由于熊猫的活力。 API 经常更改。对于未记录的方法,无论它多么有用,它都只是鲁莽的。
【解决方案4】:
df.select_dtypes(exclude = ['object'])

更新:

df.select_dtypes(include= np.number)

或使用新版本的熊猫

 df.select_dtypes('number')

【讨论】:

  • 日期时间列是不同的类型 datetime 不是数字类型
【解决方案5】:

简单的单行:

df.select_dtypes('number').columns

【讨论】:

  • 目前为止最 Pythonic 的方式,是的。
【解决方案6】:

以下代码将返回数据集的数字列的名称列表。

cnames=list(marketing_train.select_dtypes(exclude=['object']).columns)

这里marketing_train 是我的数据集,select_dtypes() 是使用排除和包含参数选择数据类型的函数,列用于获取数据集的列名 上述代码的输出如下:

['custAge',
     'campaign',
     'pdays',
     'previous',
     'emp.var.rate',
     'cons.price.idx',
     'cons.conf.idx',
     'euribor3m',
     'nr.employed',
     'pmonths',
     'pastEmail']
    

【讨论】:

    【解决方案7】:

    这是另一个在 pandas 数据框中查找数字列的简单代码,

    numeric_clmns = df.dtypes[df.dtypes != "object"].index 
    

    【讨论】:

      【解决方案8】:

      我们可以根据以下要求包含和排除数据类型:

      train.select_dtypes(include=None, exclude=None)
      train.select_dtypes(include='number') #will include all the numeric types
      

      引用自 Jupyter Notebook。

      要选择所有数字类型,请使用np.number'number'

      • 要选择字符串,您必须使用 object dtype,但请注意 这将返回 所有 对象 dtype 列

      • 查看NumPy dtype hierarchy <http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html>__

      • 要选择日期时间,请使用np.datetime64'datetime''datetime64'

      • 要选择时间增量,请使用 np.timedelta64'timedelta''timedelta64'

      • 要选择 Pandas 分类数据类型,请使用 'category'

      • 要选择 Pandas datetimetz dtypes,请使用 'datetimetz'(新 0.20.0) 或 ``'datetime64[ns, tz]'

      【讨论】:

        【解决方案9】:

        请看下面的代码:

        if(dataset.select_dtypes(include=[np.number]).shape[1] > 0):
        display(dataset.select_dtypes(include=[np.number]).describe())
        if(dataset.select_dtypes(include=[np.object]).shape[1] > 0):
        display(dataset.select_dtypes(include=[np.object]).describe())
        

        这样您可以检查该值是否为数字,例如 float 和 int 或 srting 值。第二个 if 语句用于检查对象引用的字符串值。

        【讨论】:

          【解决方案10】:

          虽然这是老话题,

          但我认为以下公式比所有其他 cmets 更容易

          df[df.describe().columns]

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          【解决方案11】:

          适应this answer,你可以做

          df.ix[:,df.applymap(np.isreal).all(axis=0)]
          

          这里,np.applymap(np.isreal) 显示数据框中的每个单元格是否为数字,.axis(all=0) 检查列中的所有值是否为 True,并返回一系列布尔值,可用于索引所需列。

          【讨论】:

            【解决方案12】:
            def is_type(df, baseType):
                import numpy as np
                import pandas as pd
                test = [issubclass(np.dtype(d).type, baseType) for d in df.dtypes]
                return pd.DataFrame(data = test, index = df.columns, columns = ["test"])
            def is_float(df):
                import numpy as np
                return is_type(df, np.float)
            def is_number(df):
                import numpy as np
                return is_type(df, np.number)
            def is_integer(df):
                import numpy as np
                return is_type(df, np.integer)
            

            【讨论】:

              猜你喜欢
              • 2022-01-14
              • 2015-07-18
              • 1970-01-01
              • 1970-01-01
              • 2019-11-06
              • 2022-11-12
              • 1970-01-01
              相关资源
              最近更新 更多