pandas groupby lteration不起作用

时间:2017-01-22 13:13:57

标签: python pandas

我已根据某些不同的群组将我的数据拆分为训练集,验证集和测试集。目的是这些集合将具有大致相同的不同类别的份额。

之后,我尝试扩展训练集中每列的数据,并对验证和测试集使用相同的转换。 由于我遍历训练集中的所有数字列,我想我可以同时对不同的组进行均值估算。因此,只遍历数字列(要素)一次。

下面用于按列扩展所有功能的工作代码:

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似乎没有做任何事情。

现在我想做的是用该组的平均值替换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。

最后,我希望培训,验证和测试设置在" normal"没有任何分组的pandas数据帧。这是一个不好的方式到达那里? 我可以遍历每个类和类型的组合来完成它,但我更喜欢,如果group by可以利用部分迭代,因为我可能想要添加其他列以供稍后分组考虑。

我对蟒蛇和熊猫都很陌生,所以如果我发现一些完全错误的话,我并不感到惊讶。

1 个答案:

答案 0 :(得分:0)

我实际上是用脏方式解​​决它,即只是循环遍历功能,类和类型(循环3)。

一旦我再次进入云端,我就会发布代码。