groupby官方解释

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

Group series using mapper (dict or key function, apply given function to group, return result as series) or by a series of columns.

讲真的,非常不能理解pandas官方文档的这种表达形式,让人真的有点摸不着头脑,example给得又少,参数也不给得很清楚,不过没有办法,还是只能选择原谅他。

groupby我用过的用法

基本用法我这里就不呈现了,我觉得用过一次的人基本不会忘记,这里我主要写一下我用过的关系groupby函数的疑惑:

apply & agg

这个问题着实困扰了我很久,经过研究,找了一些可能帮助理解的东西。先举一个例子:

import pandas as pd
df = pd.DataFrame({'Q':['LI','ZHANG','ZHANG','LI','WANG'], 'A' : [1,1,1,2,2], 'B' : [1,-1,0,1,2], 'C' : [3,4,5,6,7]})

  A B C Q 0 1 1 3 LI 1 1 -1 4 ZHANG 2 1 0 5 ZHANG 3 2 1 6 LI 4 2 2 7 WANG

df.groupby('Q').apply(lambda x:print(x))

       A  B  C   Q
    0  1  1  3  LI
    3  2  1  6  LI
       A  B  C   Q
    0  1  1  3  LI
    3  2  1  6  LI
       A  B  C     Q
    4  2  2  7  WANG
       A  B  C      Q
    1  1 -1  4  ZHANG
    2  1  0  5  ZHANG

df.groupby('Q').agg(lambda x:print(x))

    0    1
    3    2
    Name: A, dtype: int64
    4    2
    Name: A, dtype: int64
    1    1
    2    1
    Name: A, dtype: int64
    0    1
    3    1
    Name: B, dtype: int64
    4    2
    Name: B, dtype: int64
    1   -1
    2    0
    Name: B, dtype: int64
    0    3
    3    6
    Name: C, dtype: int64
    4    7
    Name: C, dtype: int64
    1    4
    2    5
    Name: C, dtype: int64

  A B C Q       LI None None None WANG None None None ZHANG None None None

从这个例子可以看出,使用apply()处理的对象是一个个的类如DataFrame的数据表,然而agg()则每次只传入一列。

不过我觉得这一点区别在实际应用中分别并不大,因为Ipython的Out输出对于这两个函数几乎没有差别,不管是处理一列还是一表。

我觉得agg()有一点让我很开心就是他可以同时传入多个函数,简直不要太方便哈哈:

df.groupby('Q').agg(['mean','std','count','max'])

  A B C   mean std count max mean std count max mean std count max Q                         LI 1.5 0.707107 2 2 1.0 0.000000 2 1 4.5 2.121320 2 6 WANG 2.0 NaN 1 2 2.0 NaN 1 2 7.0 NaN 1 7 ZHANG 1.0 0.000000 2 1 -0.5 0.707107 2 0 4.5 0.707107 2 5

Plotting

这个也是我刚刚学会的,groupby的plot简直不要太方便了:(不过这个例子选的不是很好)

%matplotlib inline
df.groupby('Q').agg(['mean','std','count','max']).plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x1133bd710>

Pandas之groupby( )用法笔记小结

MultiIndex

这个是困扰我最多的一个问题,因为如果我groupby的时候选择了两个level,之后的data总是呈现透视表的形式,如:

Muldf = df.groupby(['Q','A']).agg('mean')
print(Muldf)

               B    C
    Q     A         
    LI    1  1.0  3.0
          2  1.0  6.0
    WANG  2  2.0  7.0
    ZHANG 1 -0.5  4.5

我开始甚至以为这应该不是dataframe,是一个我可能没注意过的一个东西,可是后来我发现,这不过是MultiIndex形式的一种dataframe罢了。

Muldf.B

    Q      A
    LI     1    1.0
           2    1.0
    WANG   2    2.0
    ZHANG  1   -0.5
    Name: B, dtype: float64

如果要选择某一个index,用`xs()`函数:

Muldf.xs('LI')

  B C A     1 1.0 3.0 2 1.0 6.0

PS:有个问题困扰好久了,怎么把multiindex对象变回原来的形式呢。如:

Multiindex格式如下:(a, b, c, ...),

index column (a1,b1,c1) d1 (a2,b2,c2) d2

直接调用函数reset_index(),Multiindex中(a, b, c, ...)就变成columns了,index重置为(0,1,2,...), 如下:

index       column 0 a1 b1 c1 d1 1 a2 b2 c2 d2

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。