周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

如果图片无法观看,请移步 https://blog.csdn.net/hihell

学编程就跟打游戏一样一样的

为啥一样啊,因为要肝的

你看,学编程有很多好处

掉头发,有借口吧
不洗头,有借口吧
不洗袜子,有借口吧
不去看电影,有借口吧
不陪女朋友,有借口吧

活该单身, (❁´◡`❁)✲゚

哈哈,唯独梦想橡皮擦,她就比较厉害了,

身边的大佬全是综上所述,嘿嘿嘿

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

学个pandas在不找点乐趣,咋学啊

大周一的,弄点啥?

遥记得,上一篇最后,我说要写groupby的高级函数

后来自己理了理,忽然觉得真难

不想了写了... ...

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

后来,转念一想,不行啊,我是大佬啊

咋能不写

于是乎,我就写了今天这篇博客

groupby 核心为 split-apply-combine

啥意思呢,就是字面意思呗

分割-应用-组合

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

  • 分割,就是按照一些标准进行数据的拆分
  • 应用,给分好的组,应用一些函数上去
  • 组合,分组的数据,捣鼓捣鼓,弄成一个新的数据结构,方便后面应用

Over

这就是groupby的核心

分割,或者叫分组(拆分)步骤,是最简单的,
看好数据,写代码就可以了
(说的好像很容易似的)

使用最多的,对我们来说
是想要对数据进行一些基本的应用

也就是分组之后,我们要计算

官方文档里面介绍groupby要实现的效果

就是想模拟SQL的操作

SQL是啥?数据库的那个脚本语言(你不会不会写吧,哈哈哈O(∩_∩)O哈哈~)

groupby在模仿的就是下面这句话

select col1,col2,count(col3),sum(col4) from one_table
group by col1,col2

咦,如果你看到上面的SQL语句

发现,这个我熟悉啊

那么接下来,学习就easy了

当然,如果你不是很清楚
那就要看你的悟性了
周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

将一个dataframe对象分割成组

其实这个咱上篇文章已经做过了

再学一次,没毛病

举个代码的例子

import pandas as pd
df = pd.DataFrame([('class1','boy',100),
                   ('class2', 'boy', 90),
                   ('class3', 'girl', 80),
                   ('class1', 'unkown', None),
                   ('class2', 'unkown', 90)],index=['dawa','erwa','sanwa','siwa','wuwa'],columns=['class','sex','weight'])

print(df)

看着迷糊么?
我其实就是做了这么一个表格

咱去excel里面瞅瞅

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

pandas里面打印的无非是英文

    class     sex  weight
dawa   class1     boy   100.0
erwa   class2     boy    90.0
sanwa  class3    girl    80.0
siwa   class1  unkown     NaN
wuwa   class2  unkown    90.0

一样的,接下来,基本操作

走位,走位,瞬间清晰

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

print(df.groupby('class'))
print(df.groupby('sex',axis='columns'))
print(df.groupby(['class','sex']))

第一个,你肯定会
第二个,修改axis的轴,按照columns进行分组了,先不用管有没有意义哦
第三个,请注意,有两个列名在一个数组里面,叫做先按照class分组,在按照sex分组

那么groupby里面可以给哪些值呢?

难不成只有上面的三种

天真了吧

看操作

  1. 给一个python函数,可以作用于每一个目标轴标签上,不好理解
  2. list列表或者numpy的数组,长度和被选择的轴一致
  3. 字典或者Series,格式参照 label->group name
  4. 提供一个字符串,比如df.groupby('A')df.groupby(df['A']) 是一样的
  5. 上面任意一条,构成的list列表

好了,难吧

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

没错,说了,从这篇博客开始就开始高级部分学习了

嘿嘿

简单的多列分组代码代码如下

df = pd.DataFrame({'A': ['girl', 'boy', 'girl', 'boy',
                         'girl', 'boy', 'girl', 'girl'],
                   'B': ['one', 'one', 'two', 'three',
                         'two', 'two', 'one', 'three'],
                   'C': [3,1,4,5,6,7,8,1],
                   'D': [9,1,2,3,1,6,4,3]})

print(df)

grouped = df.groupby('A')
print(grouped)
grouped = df.groupby(['A','B'])
print(grouped)

对于一个待分组的dataframe对象来说
你可以直接用'A'或者'B'中的一个进行分组
当然也可以直接用['A','B']进行分组

这个要看你实际的需求了啊

分组之后,我们能干点啥?

当然是获取分组之后的数据啊

print(grouped.get_group('boy'))
print(grouped.get_group('girl'))

小函数,送上一枚

get_group('key name')

除了获取分组之后的数据,在送你个常用小属性,瞅瞅

grouped = df.groupby('A')
print(grouped)
print(grouped.groups)

groups这个属性非常常用哦~因为我们时常需要看一下,分组结果是否争取e

{'boy': Int64Index([1, 3, 5], dtype='int64'), 'girl': Int64Index([0, 2, 4, 6, 7], dtype='int64')}

当然学习吗,你可以使用help和dir把帮助文档弹出来
然后所有的属性和方法都清晰可见了

print(dir(grouped))
print(help(grouped))

到最后了,我在嘚啵一个知识点,这个知识点是series的

为什么又返回来,开始学习series了呢

还不是因为直接学习dataframe的多列分组,难度太大

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

我们先弄一个完美的测试栗子

arrays = [['a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]


index = pd.MultiIndex.from_arrays(arrays=arrays,names=['first','second'])

s = pd.Series([3,1,4,1,5,9,2,6],index=index)

print(s)

这个series长成这个样子

first  second
a      one       3
       two       1
b      one       4
       two       1
c      one       5
       two       9
d      one       2
       two       6
dtype: int64

一定要看明白,是分级索引哦

接下来对它进行分组,并且求和

比如,我要计算first列下面的a的和,b的和,c的和,d的和

我们可以通过level参数控制

# 这两个一个意思
print(s.groupby(level=0))
print(s.groupby(level='first'))
grouped = s.groupby(level=0)
print(grouped.sum())

搞定,看看结果

没毛病

对于second列,我们也可以分组求和的哦
周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

grouped = s.groupby(level='second')
print(grouped.sum())

咦,好像发现点问题

print("分组求和")
grouped = s.groupby(level='second')
print(grouped.sum())
print("sum函数求和")

print(s.sum(level='second'))

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

一样唉~

其实参数level也可以这么写呢level=['first','second']

好了,今天肝不动了

明天我们继续吧

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

你已经关注我公主号了,对不对

赶紧让朋友也关注啊…

周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

上一篇:groupby+agg


下一篇:Rocket - util - MaskGen