如何在Pandas中使用groupby来计算列

时间:2015-05-07 07:11:08

标签: python numpy pandas ipython

我有一个基于未聚合数据的表。我想使用GroupBy来"切片"我的每个场景的数据和计算平均值。

例如,让我们看看dota中的一些英雄,因为它是一款有趣的游戏:

Bracket MatchID Duration    Hero    Radiant Win Kills   Deaths  Assists GPM XPM CS  Denies  Level   HeroDMG
0   n   32966652    1523    Pugna   True    True    1   1   3   292 265 28  5   11  3056
1   n   32966652    1523    Lich    True    True    3   0   8   288 297 36  3   11  5115
2   n   32966652    1523    Lina    True    True    8   2   1   378 366 63  1   13  9537
3   n   32966652    1523    Kunkka  True    True    5   0   4   415 351 73  0   12  6239
4   n   32966652    1523    Bounty Hunter   True    True    1   0   2   465 362 131 4   13  1400

我希望看到每个英雄在获胜或失败时的平均毛利率是多少,而且我还希望看到它在括号中的变化情况(" n",&#34 ; h"或" v"这意味着"正常","高技能"或"非常高的技能")。

我会跑:

gpm = data.groupby(["Hero", "Bracket", "Win"]).mean()

得到这样的东西:

                        MatchID          Duration   Radiant      Kills      Deaths      Assists       GPM          XPM             CS      Denies   Level       HeroDMG
Hero    Bracket Win                                             
Alchemist   h   False   30983107.993671 2302.712025 0.462025    2.639241    8.139241    8.379747    285.753165  365.015823  113.784810  4.310127    15.674051   6132.193038
                True    30998808.981395 2499.879070 0.544186    5.265116    5.325581    15.195349   445.200000  521.162791  157.493023  4.855814    19.683721   9514.841860
            n   False   30438522.501672 2536.304348 0.494983    2.705686    8.103679    9.250836    254.806020  339.187291  98.311037   3.170569    15.829431   6201.595318
                True    30305649.194805 2683.688312 0.476190    5.320346    5.502165    15.705628   391.030303  484.995671  133.926407  3.506494    19.705628   9246.168831
            v   False   28020985.500000 2142.162879 0.518939    2.670455    7.560606    7.613636    302.996212  372.867424  119.337121  5.696970    15.284091   6232.712121
                True    28259817.386503 2415.957055 0.595092    5.171779    5.233129    15.018405   486.736196  546.564417  174.932515  7.245399    19.877301   10143.98773

现在,我想基于所有这些数字来定义炼金术士,让我们称之为"与英雄相关的功能"。我的目标是让每个英雄成为这个特征空间的数据点,因此我希望有这样的东西:

Hero        Kills_High_Win   Kills_High_Loss  Kills_Normal_Win   Kills_Normal_Loss
Alchemist  5.265116           2.639241         5.320346          2.705686

等等表格中的所有功能。我还想根据这些场景自动生成列的名称 - 只要与实际组合相关,名称就可以是任何名称(例如" Bracket" ==" n&#34 ;和"胜利" =="真")。

1 个答案:

答案 0 :(得分:1)

要到达您想要的桌子,您基本上只需要将gpm取消堆叠以将Bracket和Win移动到列中:

unstacked = gpm.unstack(['Bracket', 'Win'])

然后,您可以使用简单的str.join从列级别创建字符串:

new_cols = unstacked.columns.to_series().map(
    lambda t: '_'.join(str(e) for e in t))
# The actual string values are in the right-most column
new_cols
Out[27]: 
          Bracket  Win 
MatchID   n        True     MatchID_n_True
Duration  n        True    Duration_n_True
Radiant   n        True     Radiant_n_True
Kills     n        True       Kills_n_True
Deaths    n        True      Deaths_n_True
# etc.

并将这些设置为列:

unstacked.columns = new_cols
unstacked.iloc[:5, :5]
Out[31]: 
       MatchID_n_True Duration_n_True Radiant_n_True Kills_n_True  Hero                                                                
Kunkka       32966652            1523           True            5   
Lich         32966652            1523           True            3   
Lina         32966652            1523           True            8   
Pugna        32966652            1523           True            1   

       Deaths_n_True  
Hero                  
Kunkka             0  
Lich               0  
Lina               2  
Pugna              1