2016-05-27 10 views
1

私はパンダで.apply()の機能を実行していますが、機能に.Series.mean()を使用すると何かがうまくいかない場合があります。ここ は私のコードです:pandas.Series.mean()または.apply()に何か問題があります

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ですが、abrove結果からので、私は混乱しています、7

何が問題になっていますへの4.666667からの平均変化?

答えて

1

私は今、それは明らかだと思います - あなたは、列info_1(またはoriginal)のmeanを数える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 

私はあなたが列info_1meanをしたいと思う:

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 

編集:

テスト用i

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 

をそして、あなたはすべての列info_1mean必要がある場合:

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 
+0

をそれは '最初のmean'であることは、カラムUserInfo_2からグループによって列info_1からSeriesを返す - fを機能させるprint(group)を追加することも可能です'UserInfo_2'(10 + 4 + 0)/ 3 = 4.6666の' a 'でグループ化します。 2番目の 'b'は(8 + 2)/ 2 = 5です。 – jezrael

+0

' group'と 'master_train ['info_1']'の違いは何ですか?私は、2つのコードの「オリジナル」が同じであるという事実と混同しています。 –

+0

私はデバッグが最高だと思っています。 – jezrael

関連する問題