将pandas qcut bin应用于新数据

时间:2016-06-19 10:24:16

标签: python pandas

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

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

我的问题是,如何将从上面的qcut语句派生的相同分箱逻辑应用于一组新数据,比如用于模型验证。有一个简单的方法吗?

由于

2 个答案:

答案 0 :(得分:24)

您可以传递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是断点。现在,您可以将容器传递给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
...

答案 1 :(得分:0)

用户@Karen 说:

<块引用>

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

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

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

# Make smallest value arbitrarily smaller
train[train['value'].min(), 'value'] = train[train['value'].min(), 'value'] - 100
# Make greatest value arbitrarily greater
train[train['value'].max(), 'value'] = train[train['value'].max(), 'value'] + 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)