繁体   English   中英

熊猫分组过滤不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM