python - 如何获取训练集和测试集的虚拟变量?

标签 python pandas machine-learning feature-selection categorical-data

我想为训练集和测试集创建分类字段的虚拟变量,然后仅根据训练集和测试集的常见特征训练分类器。我正在运行下面的代码,用于在两个数据集中创建虚拟变量,但收到 TypeError

我在 Jupyter 笔记本的一个单元格中输入了以下内容

def get_features(train, test):
trainval = list(train.columns.values) # list train features
testval = list(test.columns.values) # list test features
features = list(set(trainval) & set(testval)) # check wich features are in common (remove the outcome column)
features.remove('Id') # remove non-usefull id column
return features

def process_features(train,test):
tables=[test,train]
for table in tables:
    table['SoldDt']= table[['MoSold','YrSold']].apply(lambda x : '{}-{}'.format(x[0],x[1]), axis=1)
    table['YearBuilt']= pd.to_datetime(table.YearBuilt,format="%Y")
    table['YearRemodAdd']= pd.to_datetime(table.YearRemodAdd,format="%Y")
    table['SoldDt']= pd.to_datetime(table.SoldDt,format="%m-%Y")
    table.GarageYrBlt.fillna(1,inplace=True)
    table.GarageYrBlt=table.GarageYrBlt.apply(int)
    table.GarageYrBlt.replace(1,'NaT',inplace=True)
    table['GarageYrBlt']= pd.to_datetime(table.GarageYrBlt,format="%Y")
    del table['MoSold']
    del table['YrSold']
    table['MSSubClass']=table['MSSubClass'].apply(str)
    table['OverallQual']=table['OverallQual'].apply(str)
    table['OverallCond']=table['OverallCond'].apply(str)
    table.Alley.fillna("NotAvl",inplace=True)
    table.BsmtQual.fillna("NB",inplace=True)
    table.BsmtCond.fillna("NB",inplace=True)
    table.BsmtExposure.fillna("NB",inplace=True)
    table.BsmtFinType1.fillna("NB",inplace=True)
    table.BsmtFinType2.fillna("NB",inplace=True)
    table.FireplaceQu.fillna("NF",inplace=True)
    table.GarageType.fillna("NG",inplace=True)
    table.GarageFinish.fillna("NG",inplace=True)
    table.GarageQual.fillna("NG",inplace=True)
    table.GarageCond.fillna("NG",inplace=True)
    table.PoolQC.fillna("NP",inplace=True)
    table.Fence.fillna("NFe",inplace=True)
    table.MiscFeature.fillna("NotAvl",inplace=True)
    table.LotFrontage.fillna(0,inplace=True)

    table=table.dropna(inplace=True)
    table=pd.get_dummies(table)

features = get_features(train,test)
return train,test,features

然后,我在不同的单元格中调用该函数

train = pd.read_csv('/mnt/disk2/Data/HousePrices/train.csv')
test = pd.read_csv('/mnt/disk2/Data/HousePrices/test.csv')
train,test,features = process_features(train,test)

我遇到以下错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-b2727d6cdc63> in <module>()
  1 train = pd.read_csv('/mnt/disk2/Data/HousePrices/train.csv')
  2 test = pd.read_csv('/mnt/disk2/Data/HousePrices/test.csv')
----> 3 train,test,features = process_features(train,test)

<ipython-input-16-dc47e5e9f9b6> in process_features(train, test)
 40 
 41         table=table.dropna(inplace=True)
---> 42         table=pd.get_dummies(table)
 43 
 44     print ("Getting features...")

/usr/local/lib/python3.5/dist-packages/pandas/core/reshape.py in     get_dummies(data, prefix, prefix_sep, dummy_na, columns, sparse, drop_first)
   1102     else:
   1103     result = _get_dummies_1d(data, prefix, prefix_sep, dummy_na,
-> 1104                                  sparse=sparse, drop_first=drop_first)
   1105     return result
   1106 

/usr/local/lib/python3.5/dist-packages/pandas/core/reshape.py in _get_dummies_1d(data, prefix, prefix_sep, dummy_na, sparse, drop_first)
   1123     # if all NaN
   1124     if not dummy_na and len(levels) == 0:
-> 1125         return get_empty_Frame(data, sparse)
   1126 
   1127     codes = codes.copy()

/usr/local/lib/python3.5/dist-packages/pandas/core/reshape.py in get_empty_Frame(data, sparse)
   1115             index = data.index
   1116         else:
-> 1117             index = np.arange(len(data))
   1118         if not sparse:
   1119             return DataFrame(index=index)

TypeError: object of type 'NoneType' has no len()

最佳答案

在这条线上

table=table.dropna(inplace=True)

dropna返回 None 因为文档状态

inplace : boolean, default False
    If True, do operation inplace and return None.

但随后您尝试将 None 值传递给 get_dummies()

关于python - 如何获取训练集和测试集的虚拟变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44783006/

相关文章:

python - 从 numpy 数组中选择相邻元素

python - Pandas/Numpy 根据存在将行移入列

python - tensorflow 库中缺少函数 keras.sequence.pad_sequences

python - 在 sympy python 中检查和提取组合参数

python - Pandas:如何将 int64 纪元秒的索引转换为日期时间

python - 将 Pandas 列转换为数据框

python - 根据其他列的条件在 Pandas 中创建一个新列

python - Scikit-learn 和 Yellowbrick 给出不同的分数

python - 如果不使用标准定标器,则会出现内存错误

python - 我的 PyTorch 转发函数可以执行其他操作吗?