熊猫聚合然后获得组平均值

时间:2014-10-24 16:58:05

标签: python r pandas aggregate average

我的目标是进行汇总并获得分组平均值:   - 属于特定组的列值的总和   - 除以该组中的观察数量   - 最好是在Pandas而不是去R

我的原始数据集每组有多行:

    user_id  performance  group expert_level
0   164         30          0      L-1
1   164          3          1      L-1
2   164         23          2      L-1
3   164          1          3      L-1       
4   164          1          4      L-1       
5  2178        136          0      L-3       
6  2178         16          1      L-3       
7  2178          5          2      L-3       
8  2178         25          3      L-3       
9  2178          4          4      L-3 

我希望在执行以下操作后为用户获取一行

filelocation = ~/'somefile.csv'

df = pd.read_csv(filelocation)

pivoted = df.pivot('user_id', 'group', 'performance')
lookup = df.drop_duplicates('user_id')[['user_id', 'expert_level']]
lookup.set_index(['user_id'], inplace=True)
result = pivoted.join(lookup)
result = result.fillna(0)
result.loc[:,0:15] = result.loc[:,0:15].div(result.sum(axis=1), axis=0)
print result.head()

以上操作让我关注:(有15列,但只显示了几列,但包含了组列)

                0         1         2         3         4         5         6      group
user_id                                                                         
2        0.863296  0.059643  0.023498  0.018470  0.022241  0.004797  0.000795       L-5
4        0.836877  0.018336  0.049429  0.025246  0.052706  0.002436  0.004075       L-2
16       0.910467  0.046083  0.017775  0.011192  0.011192  0.000658  0.000000       L-4
50       0.754286  0.137143  0.064762  0.009524  0.034286  0.000000  0.000000       L-5
51       0.401827  0.120086  0.041260  0.085395  0.286462  0.032434  0.001232       L-1

现在我要做的是按组级别汇总所有列以获得以下内容:

group   X0        X1        X2        X3        X4       X5       X6      X7       X8  
L-4   70294161  41480184  85284328  32006784  24122706  7559884  9984039 1226385 13104 
L-3  139093997  65157598 158343549  55562729  40113567 12062095 15126124 1642933 18661 
L-6  286610049 214763097 383541227 175932665 152843219 49444750 54246772 5863108 78769 
L-5   43320302  29719739  58270825  24719553  19347706  5876604  7483654  789694  8734  
L-2   69965163  23882048  80798434  26442583  16951986  4495711  5789449  550780  7190  
L-1   22486756   5373632  26068005   7755806   4204398   950759  1626565  123037  2156  

在我做了大熊猫之后,我将文件带到了R中以获得上表:

dt.agg <- dt[,lapply(.SD, mean),by=group]

但是你可以看到聚合数字没有意义,我如何使用pandas而不是R来获得相同的表。因为我觉得R正在做一些奇怪的事情。这些数字应该在0-1之间。

我甚至尝试了以下内容:

dt.agg <- dt[, lapply(.SD, function(x){sum(x)/.N}), by = group]

然而结果是一样的,所以我想在Pandas中完全做到这一点,而不是去R。

PS:我删除了user_id:df$user_id <- NULL

1 个答案:

答案 0 :(得分:2)

尝试:

> ddt
   user_id       X0       X1       X2       X3       X4       X5       X6 group
1:       2 0.863296 0.059643 0.023498 0.018470 0.022241 0.004797 0.000795   L-5
2:       4 0.836877 0.018336 0.049429 0.025246 0.052706 0.002436 0.004075   L-2
3:      16 0.910467 0.046083 0.017775 0.011192 0.011192 0.000658 0.000000   L-4
4:      50 0.754286 0.137143 0.064762 0.009524 0.034286 0.000000 0.000000   L-5
5:      51 0.401827 0.120086 0.041260 0.085395 0.286462 0.032434 0.001232   L-1

> ddt[,lapply(ddt[,2:8,with=F], mean),by=group]
   group        X0        X1        X2        X3        X4       X5        X6
1:   L-5 0.7533506 0.0762582 0.0393448 0.0299654 0.0813774 0.008065 0.0012204
2:   L-2 0.7533506 0.0762582 0.0393448 0.0299654 0.0813774 0.008065 0.0012204
3:   L-4 0.7533506 0.0762582 0.0393448 0.0299654 0.0813774 0.008065 0.0012204
4:   L-1 0.7533506 0.0762582 0.0393448 0.0299654 0.0813774 0.008065 0.0012204

实际上,您自己的代码也有效:

> ddt[,lapply(.SD, mean),by=group]
   group user_id       X0       X1       X2       X3        X4        X5        X6
1:   L-5      26 0.808791 0.098393 0.044130 0.013997 0.0282635 0.0023985 0.0003975
2:   L-2       4 0.836877 0.018336 0.049429 0.025246 0.0527060 0.0024360 0.0040750
3:   L-4      16 0.910467 0.046083 0.017775 0.011192 0.0111920 0.0006580 0.0000000
4:   L-1      51 0.401827 0.120086 0.041260 0.085395 0.2864620 0.0324340 0.0012320
相关问题