【问题标题】:Applying pandas qcut bins to new data将 pandas qcut bin 应用于新数据
【发布时间】:2021-09-14 21:06:11
【问题描述】:

我正在使用 pandas qcut 将一些数据分成 20 个 bin,作为数据准备的一部分,用于训练二进制分类模型,如下所示:

data['VAR_BIN'] = pd.qcut(cc_data[var], 20, labels=False)

我的问题是,我如何将上述 qcut 语句派生的相同分箱逻辑应用于一组新数据,例如用于模型验证目的。有没有简单的方法可以做到这一点?

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以通过retbins=True来做到这一点。

    考虑以下DataFrame:

    import pandas as pd
    import numpy as np
    prng = np.random.RandomState(0)
    df = pd.DataFrame(prng.randn(100, 2), columns = ["A", "B"])
    

    pd.qcut(df["A"], 20, retbins=True, labels=False) 返回一个元组,其第二个元素是 bin。所以你可以这样做:

    ser, bins = pd.qcut(df["A"], 20, retbins=True, labels=False)
    

    ser 是分类系列,bins 是断点。现在您可以将 bin 传递给 pd.cut 以将相同的分组应用于另一列:

    pd.cut(df["B"], bins=bins, labels=False, include_lowest=True)
    Out[38]: 
    0     13
    1     19
    2      3
    3      9
    4     13
    5     17
    ...
    

    【讨论】:

    • 很好的答案。希望这可以帮助像我这样愚蠢的人:第一步是qcut(带“q”),第二步是cut(不带“q”) :)
    • 通过使用这个逻辑,我在验证集中获得了 Na 值。有什么办法可以解决吗?
    • @Karen 我发布了解决这个问题的方法(晚了几年)。
    【解决方案2】:

    用户@Karen 说:

    通过使用此逻辑,我在验证集中获得了 Na 值。有什么办法解决吗?

    如果您遇到这种情况,则很可能意味着验证集的值低于(或高于)训练数据中的最小值(或最大值)。因此,某些值会超出范围,因此不会分配到 bin。

    你可以通过扩展训练数据的范围来解决这个问题:

    # Make smallest value arbitrarily smaller
    train.loc[train['value'].eq(train['value'].min()), 'value'] = train['value'].min() - 100
    # Make greatest value arbitrarily greater
    train.loc[train['value'].eq(train['value'].max()), 'value'] = train['value'].max() + 100
    # Make bins from training data
    s, b = pd.qcut(train['value'], 20, retbins=True)
    # Cut validation data
    test['bin'] = pd.cut(test['value'], b)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2015-12-21
      • 1970-01-01
      • 2016-08-21
      • 2017-10-18
      • 1970-01-01
      相关资源
      最近更新 更多