【问题标题】:Detect which columns are categorical in a dataframe with Python使用 Python 检测数据框中哪些列是分类的
【发布时间】:2020-12-15 05:56:30
【问题描述】:

我想构建一个算法,可以检测数据框中哪些列是分类列,哪些列是数字列。

让我们看一下这个数据集(仅作为示例):

df = pd.DataFrame({"ID": [12324, 26342, 62438], "passengerClass": [1, 2, 2], "nationality": ["FR", "ES", "US"]})

我可以假设分类数据是对象/类别类型:

df.dtypes()

正如我们所见,“国籍”列被检测为一个很棒的对象类型。 问题是“ID”列和“passengerClass”被检测为 int64 类型但属于分类。

有没有办法检测这些列也是分类的? (我也考虑过唯一值,但如果我们测量很多汽车的速度,它在任何时候都不会相同。增加值也是如此,因为有时我们可以删除行并且 ID 的顺序不正确)

零建议:https://stackoverflow.com/a/29803290/13919003 但在他的回答中,他并不关心 int 或 float 是分类列,而 «passengerClass» 列就是这种情况。

【问题讨论】:

标签: python pandas numpy data-science


【解决方案1】:

你可以试试这个:

df = pd.DataFrame({"ID": [12324, 26342, 62438], "passengerClass": [1, 2, 2], "nationality": ["FR", "ES", "US"]})
df = df.astype('category')
print(df.dtypes)

输出:

ID                category
passengerClass    category
nationality       category
dtype: object

注意:

在上面的示例中,所有列都转换为“类别”,但您可以为各个列显式指定dtype

-- 替代选项 -----

您可以创建配置文件以使用 dtype 显式指定列名称:

配置文件:

[
  {
    "columnName": "ID",
    "columnDtype": "category"
  },
  {
    "columnName": "passengerClass",
    "columnDtype": "category"
  },
  {
    "columnName": "nationality",
    "columnDtype": "category"
  }
]

代码:

df = pd.DataFrame({"ID": [12324, 26342, 62438], "passengerClass": [1, 2, 2], "nationality": ["FR", "ES", "US"]})

with open('./config.json') as cf:
    configList = json.load(cf)

for col in configList:
    colName = col['columnName']
    colType = col['columnDtype']
    df[colName] = df[colName].astype(colType)

print(df.dtypes)

【讨论】:

  • 在我的项目中,我有超过 80 列,这个算法应该自动完成所有事情......所以你的想法行不通:/
  • @Bonsaï,添加了一个新代码 sn-p 来动态分配列 dtypes。
  • 我还需要写配置文件吗?
  • 无需将所有列添加到配置文件中。此配置选项将使您能够更好地控制将特定 dtype 分配给您选择的列!
  • 有没有办法自动完成?我的项目(不是示例)中有 46 个没有类别类型的类别列。如果我使用配置文件,我将不得不编写类似 100 行的内容...
猜你喜欢
  • 2015-06-30
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2020-07-08
  • 2019-09-14
  • 2020-05-27
相关资源
最近更新 更多