在pandas

时间:2015-05-11 19:20:05

标签: python pandas

我有2个数据帧,按4个单独的键分组。我想将一个组的列的平均值分配给另一个组的列中的所有行值。据我了解,这是应该如何做的:

g_test.get_group((1, 5, 13, 8)).monthly_sales = \
    g_train.get_group((1, 5, 13, 8)).monthly_sales.mean()

除此之外什么都不做。 g_test中标识的组的monthly_sales中的值保持不变。有人可以解释一下我做错了什么并建议替代方案吗?

这是g_train.get_group的前几行((1,5,13,​​8))

    year month day store item units monthly_sales
    1      5    5   13     8    4   466
    1      5    6   13     8    12  475
    1      5    0   13     8    22  469
    1      5    5   13     8    26  469
    1      5    6   13     8    39  480

这些是g_test.get_group的前几行((1,5,13,​​8))

    year month day store item monthly_sales
    1      5    1   13     8    0
    1      5    2   13     8    0
    1      5    3   13     8    0
    1      5    4   13     8    0
    1      5    5   13     8    0

只显示前几行,但是g_train((1,5,13,​​8))的平均值.minly_sales是450,我希望将其复制到g_test中的monthly_sales列。

编辑: 我现在明白了,下面的代码片段将起作用:

`df1.loc[(df1.year == 1) 
    & (df1.month == 5) 
    & (df1.store == 13) 
    & (df1.item == 8), 'monthly_sales'] = \
gb2.get_group((1, 5, 13, 8)).monthly_sales.mean()`

此操作非常适合复制平均值一次,但是我将数据框分成组的全部原因是为了避免这些逻辑检查,并针对不同的存储和项目编号多次执行此操作。还有什么我可以做的吗?

2 个答案:

答案 0 :(得分:0)

您需要将结果分配回DataFrame,而不是groupby对象。这应该有效:

df1.loc[(df1.year == 1) 
        & (df1.month == 5) 
        & (df1.store == 13) 
        & (df1.item == 8), 'monthly_sales'] = \
    gb2.get_group((1, 5, 13, 8)).monthly_sales.mean()

>>> gb1.get_group((1, 5, 13, 8))
   year  month  day  store  item  units  monthly_sales
0     1      5    5     13     8      4          471.8
1     1      5    6     13     8     12          471.8
2     1      5    0     13     8     22          471.8
3     1      5    5     13     8     26          471.8
4     1      5    6     13     8     39          471.8

答案 1 :(得分:0)

其实我刚刚发现了一种更好的方法。 g_test是数据帧'test'的一部分,所以当我尝试下面的行时,它完美地运行了

Style