[英]pandas groupby lteration does not work
我通过根据一些不同的组进行分组,将我的数据分为训练集、验证集和测试集。 目的是使集合在不同类别中具有大致相等的份额。
之后,我尝试缩放训练集中每列的数据,并对验证集和测试集使用相同的转换。 由于我迭代了训练集中的所有数字列,因此我认为我可以同时对不同组进行平均插补。 因此,只迭代数字列(特征)一次。
以下用于按列缩放所有功能的工作代码:
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
apply-versions 似乎没有做任何事情。
现在我想做的是用该组的平均值替换 NaN。 我尝试了以下方法:
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 可以利用部分迭代,因为我可能想添加其他列以便稍后考虑分组。
我对 python 和 Pandas 都不熟悉,所以如果我完全错了,我并不感到惊讶。
我实际上以肮脏的方式解决了它,即只是循环访问特性、类和类型(3 个 for 循环)。
一旦我再次在云端,我会发布代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.