Pandas 【Chapter 4】

分组

想要实现分组操作,必须明确三个要素:分组依据 、 数据来源 、 操作及其返回结果 。

df.groupby(分组依据)[数据来源].使用操作

需要根据多个维度进行分组,只需在 groupby 中传入相应列名构成的列表即可

  • 当 size 作为 DataFrame 的属性时,返回的是表长乘以表宽的大小,但在 groupby 对象上表示统计每个组的元素个数
  • 通过 get_group 方法可以直接获取所在组对应的行,此时必须知道组的具体名字
gb = df.groupby(['School', 'Grade'])
gb.get_group(('Fudan University', 'Freshman')).iloc[:3, :3]
# 练一练
#请根据上下四分位数分割,将体重分为high、normal、low三组,统计身高的均值。
df['Weight Level']='normal'
df.loc[df['Weight']> df.Weight.quantile(0.75),'Weight Level']='high'
df.loc[df['Weight']< df.Weight.quantile(0.25),'Weight Level']='low'
df.groupby('Weight Level')['Height'].mean()

聚合函数

首先要了解一些直接定义在groupby对象的聚合函数,因为它的速度基本都会经过内部的优化,使用功能时应当优先考虑。根据返回标量值的原则,包括如下函数: max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod 。

明确 all/any/mad/skew/sem/prod 函数的含义

  • all和any一般用于bool值列 , all表示分组后每一组中所有值都为True则返回True , 有一个False就返回False
  • any与all类似 , 表示bool值列中只要有一个True则返回true , 只有全为False才会返回False
  • mad(mean absolute deviation)平均绝对离差
  • skew(skewness)偏度 , 用来反映分组后每组数据分布的偏态程度 , 正值为右偏 , 绝对值越大 , 偏度越高
  • 类似的 , kurt(kurtosis)峰度 , 用来反映分组后每组数据分布的平尖程度 , 正值为尖峰分布 , 值越大越尖 , 负值为扁平程度 , 绝对值越大越平

agg函数解决四类问题

  • 【a】使用多个函数
gb.agg(['sum', 'idxmax', 'skew'])
  • 对特定的列使用特定的聚合函数
gb.agg({'Height':['mean','max'], 'Weight':'count'})

# 练一练
gb=df.groupby('Gender')[['Height', 'Weight']]
gb.agg({'Height':['sum', 'idxmax', 'skew'],'Weight':['sum', 'idxmax', 'skew']})
  • 使用自定义函数:在 agg 中可以使用具体的自定义函数, 需要注意传入函数的参数是之前数据源中的列,逐列进行计算 。
gb.agg(lambda x: x.mean()-x.min())
#练一练
gb.agg(['count','mean','std','min',('25%',lambda x:x.quantile(0.25)),('50%','quantile'),('75%',lambda x:x.quantile(0.75)),'max'])
  • 聚合结果重命名
 gb.agg([('range', lambda x: x.max()-x.min()), ('my_sum', 'sum')])

变换与过滤

在 groupby 对象中,定义了 filter 方法进行组的筛选,其中自定义函数的输入参数为数据源构成的 DataFrame 本身,在之前例子中定义的 groupby 对象中,传入的就是 df[['Height', 'Weight']]

练习题

1

#过滤不超过2次的
countryCount=df.groupby('Country')['Brand'].count()
df_drop=df.drop(df[df['Country'].isin(countryCount[countryCount<=2].index)].index,axis=0)
df_drop.groupby('Country')['Price'].agg(['mean',('Cov',lambda x: x.std()/x.mean()),'count'])
#按照表中位置的前三分之一、中间三分之一和后三分之一分组,统计 Price 的均值。
W=df_drop.Price
conda=W.mask(W<W.quantile(0.333),'low').mask(W>W.quantile(0.6667),'high').mask((W>=W.quantile(0.3333))&(W<=W.quantile(0.6667)),'middle')
df_drop.groupby(conda)['Price'].mean()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容