我根据一些不同的组将数据分成训练集,验证集和测试集 . 目的是这些集合将具有大致相同的不同类别的份额 .
之后,我正在尝试扩展训练集中每列的数据,并对验证和测试集使用相同的转换 . 由于我遍历训练集中的所有数字列,我想我可以同时对不同的组进行均值估算 . 因此,只遍历数字列(要素)一次 .
下面的工作代码用于按列扩展所有功能:
for feature_name in numeric_columns:
tmp_feature_mean = train[feature_name].mean()
tmp_feature_std = train[feature_name].std()
train[feature_name].apply(lambda x: (x-tmp_feature_mean)/tmp_feature_std) # !Works
val[feature_name].apply(lambda x: (x-tmp_feature_mean)/tmp_feature_std) # !Works
test[feature_name].apply(lambda x: (x-tmp_feature_mean)/tmp_feature_std) # !Works
train[feature_name] = (train[feature_name]-tmp_feature_mean)/tmp_feature_std # Works
val[feature_name] = (val[feature_name]-tmp_feature_mean)/tmp_feature_std # Works
test[feature_name] = (test[feature_name]-tmp_feature_mean)/tmp_feature_std # Works
应用版本似乎没有做任何事情 .
现在我想做的是用该组的平均值取代NaNs . 我尝试了以下方法:
train_Scaled = train.groupby(['class', 'type'])
val_Scaled = val.groupby(['class', 'type'])
test_Scaled = test.groupby(['class', 'type'])
for feature_name in numeric_columns:
train_feature_mean = train_Scaled[feature_name].mean()
print "train_feature_mean: {}".format(train_feature_mean)
train_feature_std = train_Scaled[feature_name].std()
print "train_feature_std: {}".format(train_feature_std)
train_Scaled[feature_name] = (train_Scaled[feature_name]-train_feature_mean)/train_feature_std # ValueError
val_Scaled[feature_name] = (val_Scaled[feature_name]-train_feature_mean)/train_feature_std
test_Scaled[feature_name] = (test_Scaled[feature_name]-train_feature_mean)/train_feature_std
for name, group in train_Scaled:
train_feature_group_mean = train_Scaled[feature_name].get_group(name).mean()
print train_feature_group_mean
train_feature_group_std = train_Scaled[feature_name].get_group(name).std()
print train_feature_group_std
因此,对于类和类型的每个组合,我想用该组合的均值填充NaN . 在上面的代码中,我根本没有包含填充,因为我已经遇到了一个问题:
train_Scaled[feature_name] = (train_Scaled[feature_name]-train_feature_mean)/train_feature_std# Works
现在它失败了以前版本中的代码 . 差异可能与分组有关 .
我还测试过首先通过组遍历并通过功能进行迭代 . 这样,我试着像这样填充NaN:train_Scaled [feature_name] .get_group(name).fillna(train_group_feature_mean)
但那没有做任何事情 . 但是,重要的是还要在验证和测试集中使用训练集的组平均值填充NaN .
最后,我希望在“普通”pandas数据帧中进行训练,验证和测试集,而无需任何分组 . 这是一个不好的方式来到那里?我可以遍历每个类和类型的组合来完成它,但是我更喜欢group by可以利用部分迭代,因为我可能想要添加其他列以便稍后进行分组 .
我是蟒蛇和熊猫的新手,所以如果我遇到了一些完全错误的话,我并不感到惊讶 .
1 回答
我实际上用脏的方式解决了它,即只是循环遍历功能,类和类型(循环3) .
一旦我再次进入 Cloud 端,我就会发布代码 .