pandas.Series.mean()或.apply()中的错误

时间:2016-05-27 06:44:07

标签: python-2.7 pandas

我在大熊猫中练习.apply()的功能,但是当我在函数中使用.Series.mean()时会出现问题。 这是我的代码:

In[1]: column = ['UserInfo_2', 'UserInfo_4','info_1', 'info_2', 'info_3','target']
       value = [['a', 'b', 'a', 'c', 'b', 'a'],
                ['a', 'c', 'b', 'c', 'b', 'b'],
                range(0, 11, 2),
                range(1, 12, 2),
                range(15, 21),
                [0, 0, 1, 0, 1, 0]
               ]
       master_train = pd.DataFrame(dict(zip(column, value)))
In[2]: def f(group):
            return pd.DataFrame({'original': group,'demand':group-group.mean()})
In[3]: master_train.groupby('UserInfo_2')['info_1'].apply(f)
Out[3]:     
     demand original
0   -4.666667   0
1   -3.000000   2
2   -0.666667   4
3    0.000000   6
4    3.000000   8
5    5.333333   10

我感到困惑,因为info_1的平均值实际上是5,但从结果开始,平均值从4.666667变为7。

出了什么问题?

1 个答案:

答案 0 :(得分:1)

我认为现在很明显 - 您从mean列的info_1开始计算original列{或groups UserInfo_2

def f(group):
    return pd.DataFrame({'original': group,
                         'groups': group.name,
                         'demand':group - group.mean() ,
                         'mean':group.mean()})

print (master_train.groupby('UserInfo_2')['info_1'].apply(f))

     demand groups      mean  original
0 -4.666667      a  4.666667         0
1 -3.000000      b  5.000000         2
2 -0.666667      a  4.666667         4
3  0.000000      c  6.000000         6
4  3.000000      b  5.000000         8
5  5.333333      a  4.666667        10

我认为你想要mean列的info_1

def f(group):
    return pd.DataFrame({'original': group,
                         'demand':group - master_train['info_1'].mean(),
                         'mean':master_train['info_1'].mean()})

print (master_train.groupby('UserInfo_2')['info_1'].apply(f))
   demand  mean  original
0    -5.0   5.0         0
1    -3.0   5.0         2
2    -1.0   5.0         4
3     1.0   5.0         6
4     3.0   5.0         8
5     5.0   5.0        10

编辑:

为了进行测试,可以将print(group)添加到f功能中 - 它会从Series列中的组info_1返回UserInfo_2

def f(group):
    print (group)
    return pd.DataFrame({'original': group,
                         'groups': group.name,
                         'demand':group - group.mean() ,
                         'mean':group.mean()})

print (master_train.groupby('UserInfo_2')['info_1'].apply(f))

0     0
2     4
5    10
Name: a, dtype: int32
1    2
4    8
Name: b, dtype: int32
3    6
Name: c, dtype: int32
     demand groups      mean  original
0 -4.666667      a  4.666667         0
1 -3.000000      b  5.000000         2
2 -0.666667      a  4.666667         4
3  0.000000      c  6.000000         6
4  3.000000      b  5.000000         8
5  5.333333      a  4.666667        10

如果您需要所有列mean中的info_1

print (master_train['info_1'])
0     0
1     2
2     4
3     6
4     8
5    10
Name: info_1, dtype: int32

print (master_train['info_1'].mean())
5.0