什么是一个很好的启发式检测pandas.DataFrame中的列是否是分类?

Ran*_*son 21 python pandas scikit-learn

我一直在开发一种自动预处理pandas.DataFrame格式数据的工具.在此预处理步骤中,我希望以不同方式处理连续和分类数据.我特别希望能够适用,例如,一个OneHotEncoder来中的分类数据.

现在,让我们假设我们提供了一个pandas.DataFrame,并且没有关于DataFrame中数据的其他信息.用于确定pandas.DataFrame中的列是否属于分类的良好启发式方法是什么?

我最初的想法是:

1)如果列中有字符串(例如,列数据类型是object),则该列很可能包含分类数据

2)如果列中某些值的值是唯一的(例如,> = 20%),那么该列很可能包含连续数据

我发现1)工作正常,但2)还没有很好地完成.我需要更好的启发式方法.你会如何解决这个问题?

编辑:有人要求我解释为什么2)效果不好.在某些测试案例中,我们仍然在列中有连续值,但列中的唯一值不多.2)在这种情况下,启发式显然失败了.还有一些问题,我们有一个分类列,其中有许多独特的值,例如泰坦尼克号数据集中的乘客名称.那里有相同的列类型错误分类问题.

Ris*_*ava 24

以下是几种方法:

  1. 查找唯一值的数量与唯一值的总数之比.像下面这样的东西

    likely_cat = {}
    for var in df.columns:
        likely_cat[var] = 1.*df[var].nunique()/df[var].count() < 0.05 #or some other threshold
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检查前n个唯一值是否占所有值的一定比例

    top_n = 10 
    likely_cat = {}
    for var in df.columns:
        likely_cat[var] = 1.*df[var].value_counts(normalize=True).head(top_n).sum() > 0.8 #or some other threshold
    
    Run Code Online (Sandbox Code Playgroud)

方法1)对我来说通常比​​方法2)更好.但是如果存在"长尾分布",则方法2)更好,其中少数分类变量具有高频率而大量分类变量具有低频率.


Die*_*ego 5

有很多地方可以“窃取”可以转换为“数字”的格式定义。##,#e-# 将是这样的格式之一,只是为了说明。也许你能找到一个图书馆来做到这一点。我尝试先将所有内容都转换为数字,然后再将剩下的内容转换为数字,好吧,除了将它们保持为分类之外别无他法。


Jan*_*ins 1

IMO 相反的策略,识别类别更好,因为它取决于数据的内容。从技术上讲,地址数据可以被认为是无序的分类数据,但通常我不会那样使用它。

对于调查数据,一个想法是寻找李克特量表,例如 5-8 个值,或者字符串(可能需要硬编码(和翻译)级别来查找“好”、“坏”、“同意。、 “very .*”,...) 或 0-8 范围内的 int 值 + NA。

国家和类似的东西也可能是可识别的......

年龄组(“.- . ”)也可能有效。