欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

程序员文章站 2022-04-08 12:53:24
如果图片无法观看,请移步 https://blog.csdn.net/hihell 周三了,一个星期最难的一天 大中间的,今天还这么热 5月份,36度的高温 天空飘过几个字 屋里学pandas最得劲 Groupy DataFrame with Index Levels and Columns 说白了 ......

如果图片无法观看,请移步

周三了,一个星期最难的一天

大中间的,今天还这么热

5月份,36度的高温

天空飘过几个字

屋里学pandas最得劲
破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

groupy dataframe with index levels and columns

说白了就是通过index和columns混合分组

例子走起,(不赶紧写例子,都不知道要怎么解释啦)

import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

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

df = pd.dataframe({'a':[3,1,4,5,9,2,6,1],
                   'b':[1,1,1,1,2,2,3,3]},index=index)


print(df)

有例子,就有例子展示,对吧

              a  b
first second      
bar   one     3  1
      two     1  1
baz   one     4  1
      two     5  1
foo   one     9  2
      two     2  2
qux   one     6  3
      two     1  3

接下来,大招展示的环节的

我要按照second的index索引和b列进行分组

代码先行一步,效果稍后就来

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

grouped = df.groupby([pd.grouper(level=1),'b']).sum()
print(grouped)

注意看到groupby里面有两个值,一个是pd.grouper(level=1) 这个为second的index
第二个为b columns

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9
手太抖了,没画好,灵魂画手

主要就是为了让你看明白,分组是怎么计算的哦~

当然,你也可以通过index的名字进行分组

df.groupby([pd.grouper(level='second'), 'a']).sum()

和上面的效果是一样一样的

甚至,我们可以直接简写成

df.groupby(['second', 'a']).sum()

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

分组之后的数据可以选择部分,也可以迭代

这个部分,其实我们已经实现过了

再拿出来,重温一下

df = pd.dataframe({'a':['bar', 'bar', 'foo', 'foo', 'foo', 'foo', 'foo'],
                   'b':['one', 'two', 'one', 'two', 'one', 'two', 'three'],
                   'c':[3,1,4,5,9,2,6],
                   'd':[1,1,1,1,2,2,3]})


print(df)

grouped = df.groupby('a')

for name,group in grouped:
    print(name)
    print(group)

看到分组的名字分别是bar和foo,熟悉吧,常规操作

迭代的时候,用for in 循环即可

bar
     a    b  c  d
0  bar  one  3  1
1  bar  two  1  1
foo
     a      b  c  d
2  foo    one  4  1
3  foo    two  5  1
4  foo    one  9  2
5  foo    two  2  2
6  foo  three  6  3

如果按照多keys分组,例如groupby(['a','b'])

它会自然而然的形成一个元组name

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9
可以迭代,就可以部分选择,上篇博客有哦!

bars = grouped.get_group('bar') # 通过分组的名字
print(bars)

另一个呢?

df.groupby(['a', 'b']).get_group(('bar', 'one'))

唉,对喽,这么写,就比较对了

难度系数的大了,要来了,聚合函数

首先看一下内置的聚合函数

sum(), mean(), max(), min(), count(), size(), describe()

竟然才这么几个,那是因为我没写全

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

这个咱们已经操作很多次了

接下来可以看一个高级一些的

可自定义函数,传入agg方法中

我们还是通过刚才的数据进行分析

    a      b  c  d
0  bar    one  3  1
1  bar    two  1  1
2  foo    one  4  1
3  foo    two  5  1
4  foo    one  9  2
5  foo    two  2  2
6  foo  three  6  3

按照a和b进行分组
a有2个值,b有3个值,所以分组之后形成5组

看清楚,不要眨眼,操作来了

grouped = df.groupby(['a','b'])
print(grouped.agg('mean'))

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9
思路转换,单列求平均值

grouped = df.groupby(['a','b'])
print(grouped['c'].agg('mean'))

继续思路转换,给单列多个聚合函数

print(grouped['c'].agg(['mean','sum']))

很厉害,学到了吧

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

继续来,不要怕,求多种聚合运算的同时更改列名

print(grouped['c'].agg([('a','mean'),('b','max')]))

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

不同的列运用不同的聚合函数

print(grouped.agg({'c':['sum','mean'],'d':['min','max']}))

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

这些都是agg干的,我还可以继续编哦~

groupby中,可以修改成无索引形式
注意核心加了一个参数as_index=false

grouped = df.groupby(['a','b'],as_index=false)

print(grouped.agg({'c':['sum','mean'],'d':['min','max']}))

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

最后一个操作,agg里面是可以使用自定义的聚合函数

一般,都是这个案例,我呢,当然不能例外啦

grouped = df.groupby('a')

def max_min(group):
    return group.max()-group.min()

print(grouped.agg(max_min))

agg(自定义的函数)

这个地方的自定义函数,还支持lambda的哦~

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9

迷糊了吧,迷糊也没事,拿的住手机就行

拍这里,拍这个里

破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9