我正在使用pandas qcut将一些数据拆分为20个bin,作为数据准备的一部分,用于训练二进制分类模型,如下所示:
data['VAR_BIN'] = pd.qcut(cc_data[var], 20, labels=False)
我的问题是,如何将从上面的qcut语句派生的相同分箱逻辑应用于一组新数据,比如用于模型验证。有一个简单的方法吗?
由于
答案 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)